WM_CH 发表于 2017-7-4 19:20:58

CAN总线通信中,主动错误和被动错误的通俗解释

最近在看CAN相关的东西,找了很多资料,对于错误帧这一块都说的不是太透彻,直到我发现了一篇网上的文章。。。

现在上传上来,大家讨论讨论。


----------------------------------------------------------------------------------------------------------------------------------------------
CAN 总线中主动错误和被动错误的通俗解释
首先建议把广泛使用的“主动错误”和“被动错误”概念换成“主动报错”和“被动报错”。
1. 主动报错站点
    只要检查到错误,它立即“主动地”发出错标识。所谓“出错标识“,它本身就是一个“错误的位序列”(连续的6个显性位,不满足CAN协议的“最多5个连续的同性位”要求),
目的是“主动地”告诉大家:即使你们没有发现“刚才我已发现”的错误,现在我“以身作则”出错啦!你们该看到这个错误了吧!

2. 被动报错站点
    如果检查到错误,它只能干瞪眼“被动地”等别人(主动报错站点)报错,等待的时候它可不能去动总线(发了的隐性错误标志,也不能被总线上其他节点察觉到),
直到识别出由主动报错站点发出 的“错误的位序列”,它才松了一口气:有人正式报错了!然后他就可以去竞争总线,该干啥干啥。

3. 出错标识本身没有什么优先级的问题。

4. 对于通过竞争得到总线使用权的发送站点来说,它在一边发一边听,有可能出现以下几种情况:
(a) 它自己就发现错误,它就干脆哗啦哗啦,乱发一气(连续的发六个同性位)。
目的就是告诉别人(别的站点):出错了!

(b) 它自己没有发现错误,但作为主动报错的接收站点发现了错误(比如因为线路长,干扰大引起的错误),
这个发现错误的站点就会立即哗啦哗啦往总线上乱发一气(连续的发六个显性位)。
目的就是告诉你自己以及告诉别人(发送站点和别的站点):出错了!

(c) 它自己没有发现错误,但作为被动报错的接收站点发现了错误(比如因为线路长,干扰大引起的错误),
这个发现错误的站点只能慢慢的等待,等待别的主动报错站点报错。
如果别的主动报错站点没发现错误,那就继续等,
一直等到该发ACK的时候不给发送站发这个显性的ACK信号,当然了其他站点可能会发这个ACK,那说明其他站点没有发生错误,没办法,别人能正常通信,你不能!
然后积攒到一定的时候,你就脱离总线吧!
再继续等待一段时间,脱胎换骨,重新回到总线上(这个时候错误记录都清0了,你变成了主动报错站!)。

就象你在学校课堂黑板上写字,写错一个笔画你自己没发现,但被别的经常写错字的同学(被动报错站点)发现了,但他不能说,非常尬(老师同学们早不信他了,他自己经常写错字),
他就只能等,等老师来发现你的错误(等待主动报错站点报错),
但有时候老师没眼力,那他就只能等到老师问大家“他写的对不对”的时候,他不说话表示抗议(不发ACK)(他的抗议没人吊他的),不过老师却主动说你写的对(给你发ACK)!
那位同学没办法,只能含着泪默默的在心里记一刀(错误计数+1)继续等,
等到他也当老师了(脱胎换骨了)终于看到别人错误的时候,能跳出来叫一声!你丫写错了傻比!...








关于以后 发表于 2017-7-5 08:59:16

通俗易懂!

myxiaonia 发表于 2017-7-5 11:24:05

哈哈哈有意思,其实协议很多时候就这样的

看代码文字好像觉得摸不着头脑,其实来历就是这么简单通俗

gujiamao_love 发表于 2017-7-5 11:52:22

出错了怎么处理?

WM_CH 发表于 2017-7-5 14:35:18

再补上关于过载帧方面的介绍文档






WM_CH 发表于 2017-7-5 14:35:55

gujiamao_love 发表于 2017-7-5 11:52
出错了怎么处理?

刚开始看协议,,,一脸懵
页: [1]
查看完整版本: CAN总线通信中,主动错误和被动错误的通俗解释