444_J1939源地址冲突时候的协议栈处理行为分析

         全部的学习汇总: https://github.com/GreyZhang/J1939_basic

         之前测试用的两个板子,测试的过程中为了区分增加了一个定义:板子定义为A(地址0x80),B的地址为0x81。

         现在,我手里的B板子已经进行了一次地址声明且测试过了。现在,尝试做一下测试,修改A板的程序让它的地址也设置为0x81,这样等我的A板上电运行进行地址声明的时候应该会出现冲突。

         简单的修改如下:

444_J1939源地址冲突时候的协议栈处理行为分析

         软件修改编译过之后,烧写到板子。先做一个断掉B板CAN总线连接的测试:

444_J1939源地址冲突时候的协议栈处理行为分析

         可以看得出,这个跟之前的效果一致。一直等待,没有其他的报文出现。肯定是没有的,毕竟只有一个节点没有冲突。

         接下来,2个板子全都连接到CAN总线。结果,进行地址声明的时候出现两条报文。感觉上,应该是地址声明失败了。接下来,对报文内容进行解读一下。

444_J1939源地址冲突时候的协议栈处理行为分析

         多出来的一条报文,也是ACL报文,这个也是用于地址声明的。而这个报文的地址是0xFE,发送的方式也是广播。而0xFE,也就是254,其实是空地址。下面再看一下地址相关的定义:

444_J1939源地址冲突时候的协议栈处理行为分析

         为什么发送出来的地址是254而不是0x81呢?难道是因为出现了地址冲突,两个板子的源地址都失效了?

444_J1939源地址冲突时候的协议栈处理行为分析

444_J1939源地址冲突时候的协议栈处理行为分析

         我的软件中,A板的NAME是小于B的,这样看,A板能够得到这个地址。看起来,上面的这条无地址的报文应该是B板发出来的。接下来再做一个测试,把A板的NAME修改成大于B板的数值。

444_J1939源地址冲突时候的协议栈处理行为分析

         再次测试,结果按键无法触发请求报文了。说明,现在的CA地址声明失败因此不能够发报文了。

         保持现在的状态,接下来改一下测试条件。把B板的按键触发的请求改成发给全局地址,看看没有得到地址的A板是否可以响应。

         跟我预期的差不多,A板虽然地址声明失败,但是上面的LED依然可以响应B板的请求。