我被AI骗了—关于CAN总线填充机制的回答
先说结论,AI只会基于现有知识点,通过神经网络组织起逻辑框架,很多负责的问题,AI的逻辑也会出错,故我们使用AI也要保持质疑的心理!!万万不可全信AI,
1、事情起因
是这样的,一位读者在阅读 CAN的填充机制解释及其延伸知识_can 填充位-CSDN博客 我的一篇文章时,在关于 “填充位是否应该计入相同连续位计数的问题” 。
文中解释如下:
这位读者,提出了一下疑问? 如下图:
给大家解释一下 :
这位读者疑问在于:如果存在以下原始数据(可以理解为应用层或传输层的PDU)
(二进制)1111 1000 0000,按照 “填充位也要计入连续位计数” 的规则,
填充后,将以以下时序发出 1111 1 0(填充位)0000 1(填充位)000。但是协议中,又规定“接收方”在接收时,采取以下逻辑“当检测到五位连续极性的bit时,先检查第6个bit是否与前5bit极性相反,极性相反则符合填充规则,极性没有反转的情况下,会直接报出数据填充错误”
读者疑问点:他认为,接收端接收时直接删除填充位,然后再按照连续接收五个相同极性位,继续接收?
说实话,当时我也被问懵逼了,工作原因,也没细想。下班后推理了一下,按照读者逻辑“确实会存在以下问题”。
(1)按照“填充位也会被计入连续极性bit位计数”的规则,会将发送端填充的数据位,当做正常数据接收的可能。导致接收端数据的错误(CRC计算值与发送端发送的值肯定不匹配)
(2)但是,我也留了个心眼,有没有一种可能“读者本身的前提条件就是错误的”
(3)凭着直觉,我感觉读者是不是混淆了,接收方“关于删除填充位的描述”是他混淆了概念
2、推理求证
带着问题,我首先进行了正面求证?我直接将读者的疑问问了AI,DeepSeek和豆包都给出结论,填充不计入“连续极性计数”。
但是我不放心,利用手头资源,作了个实验,用逻辑分析仪直接测量(逻辑分析仪不会使用的同学,参考一下文章逻辑分析仪——KingstLA5016使用方式,使用观察CAN_FD总线-CSDN博客):条件如下
(1)搭建好测试环境,我将VN1640A上两个CANchannel端口,相互连接,并配置好120Ω的终端电阻。
(2)一个通道发送,一个通道接收。
(3)发送通道设置一个报文,ID随便写,将数据Byte0=0xF8,Byte1=3F,根据CAN数据段发送规则“Byte0,先发送,最后一位Byten最后发送”,“Byte内部,最高位bit7最先发送的规则”。
可以直接写出 二进制数据流应该如下图
结论有了,我们直接 查看结果
填充位,专门用绿色字体标注,故此时真相大白,AI在一本正经的胡说八道。关于AI是如何自圆其说的,最后附录会原文张贴。
重要结论:填充位是会计入连续极性位计数的。
3、疑惑出现的原因分析
再次看读者提出疑问的原文:
“有一个地方不太理解,请教一下,填充位也会加入连续电平的计算么?因为我看接收节点的工作规则是:连续接收5个一样的电平之后,会删除下一个电平,继续接收。如果是这样,按照前面给出的案例。接收五个隐性电平之后,会删掉下一个填充位,然后继续接收,接下来就只接收到4个显性电平,这时候就不会执行删除操作,那后面那些填充位不就被当成数据读了么?”
这位读者,将接收节点看的太智能了,其实接收节点压根不会判断哪一位到底是不是填充位,在接收节点,只存在一个连续电平计数器,在接收数据流时,接收节点根据连续接收到的电平极性,依次增加计数,当1<=计数<=5时,只要在此区间内,检测到相反极性,计数器会重新置位为0。
如下图所示:
(2)如下图,框选的描述也是存在误解的
如上文所说,接收方,确定自己为接收节点后,就“开启连续电平计数器”,按照上段描述的逻辑工作,读者这里的“删除一个电平”,也是误解了规范中的意思,接收节点是无法删除一个电平的。正确的理解应该是,数据链路层将接收数据给到更上一层(如传输层时),会将接收原始数据中的填充位去除。。。
读者潜在的逻辑是这样的:“接收节点在接收到连续5个相同极性的电平后,会将接下来的1位相反极性的电平,标注为填充位,删除此位,然后计数器置位为0,重新统计连续极性位”
总结:接收端节点的数据链路层,压根不会删除任何电平,它也不会判断哪一位是填充位,只会根据固定的规则,控制计数器递增或重新置0,或者计数器达到预定值后,判断下一位电平的极性,根据判断结果,是否发出填充错误帧
4、AI一本正经胡说八道的原文
感兴趣的朋友可以看看,有没有大佬解释下,他为什么会瞎回答问题。
问题:
“有一个地方不太理解,请教一下,填充位也会加入连续电平的计算么?因为我看接收节点的工作规则是:连续接收5个一样的电平之后,会删除下一个电平,继续接收。如果是这样,按照前面给出的案例。接收五个隐性电平之后,会删掉下一个填充位,然后继续接收,接下来就只接收到4个显性电平,这时候就不会执行删除操作,那后面那些填充位不就被当成数据读了么?”
AI回答:
关于CAN总线中填充位与连续电平计数的关系,关键在于理解接收端的处理机制。以下分步骤解释你的疑问:
1. CAN总线填充位规则的核心逻辑
发送端规则:当原始数据中出现连续5个相同电平时,发送端必须插入一个相反电平的填充位(如连续5个隐性电平后插入1个显性填充位)。
接收端规则:接收端在检测到连续5个相同电平后,会自动删除下一个电平(即填充位),并重置计数器。
2. 填充位是否参与连续电平计算?
答案:填充位本身不参与连续电平的计数。
接收端的逻辑是:
对原始数据+填充位的连续电平进行计数;
一旦检测到连续5个相同电平,立即判定下一个电平是填充位并删除;
删除填充位后,计数器重置为0,从下一个电平重新开始计数。
3. 通过案例验证逻辑
假设原始数据为:
隐性-隐性-隐性-隐性-隐性
(连续5个隐性电平)
发送端插入填充位后实际发送:
隐性-隐性-隐性-隐性-隐性-显性(填充位)-显性-显性-显性-显性
接收端处理过程:
接收到前5个隐性电平 → 触发删除规则;
删除第6个显性电平(填充位);
计数器重置为0,从第7个显性电平重新开始计数;
后续连续4个显性电平 → 未达到5个相同电平,不触发删除;
最终解析出的数据为原始数据:
隐性×5 + 显性×4
。4. 为什么不会误读填充位?
发送端的填充规则确保了任何连续5个相同电平后必然存在一个填充位;
接收端的删除规则会严格删除填充位,并重置计数器,因此:
填充位后的数据从“计数器=0”开始重新计数;
即使后续数据中有填充位,也会被正确识别和删除。
5. 极端情况模拟
假设原始数据中存在连续5个隐性电平,且后续数据又出现连续5个隐性电平:
隐性×5(原始数据) → 显性(填充位) → 隐性×5(新数据)
接收端处理:
删除第一个填充位后,解析出原始数据
隐性×5
;后续接收到
隐性×5
→ 再次触发删除规则,删除下一个填充位;最终数据仍为
隐性×5 + 隐性×5
,无错误。总结
填充位是发送端插入的“冗余位”,接收端会按规则删除,且删除后计数器重置;
填充位本身不参与后续计数,因此不会出现误将填充位当作数据的情况;
CAN总线的位填充机制通过严格的发送/接收规则,确保了数据的完整性和同步性。