442_J1939 PDU Format判断

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

         如果看到细微之处,CAN通信似乎从来都不是那么简单。尤其是到了协议栈的环节,万千变化最后还得回归到枯燥的文档,的确是不容易啃透。我自己尝试了多次J1939的学习,但是大部分都是处于理论性的材料学习,而这种学习基本上也是看完后面的前面的就会忘记。

         正好手头有两个PIC18Fxxxx的开发板,虽然MCU的型号不同但是至少是架构一致而且全都带有一个ECAN模块。这样,microchip的一份J1939的库例程其实基本上就可以原汁原味的体验一下了。虽说,不可能一次性掌握J1939,但是最起码可以看到一点点贴近标准做法的东西。

         这次调试的例程使用的开发板上的MCU一个是PIC18F2580,另一个是PIC18F4580。例子大致的描述如下:

         从上面的描述看,每个板子除了CAN以外,我还各需要一个LED和按键。而关键的代码如下:

         这里做了两个判断。第一个是按键判断,如果按键状态发生了变化那么根据按键状态调整PDU Format,之后组装消息发送出去。而这儿的发送,使用了一个库里面提供的1939的队列发送功能。第二个判断是针对接收到的消息,判断了一下PDU Format。根据PDU Format的数值来控制LED灯的状态。

         从上面的代码中,暂且是看到了这些。而今天的小结以及试验,也不去深究这个J1939协议栈的实现,先看看原汁原味的例程的效果。下一次的分析小结中,会着重看看这里面的目标地址信息究竟是如何处理的。

         两个板子并不相同,关于LED以及按键我自己做了一下调整,同时也增加了一些串口相关的功能辅助我的调试。为了容易理解,学习笔记的整理只放相关的部分关键代码或者接口。这样,我自己回顾笔记也会容易不少。

         为了模拟一个网络建立的真实状态,我的两个板子都在一个USB HUB上取电,这样我就可以插拔USB然后记录log后面分析整个报文过程。

         首先说一下实际观感下的现象:两个板子分别命名为A、B。如果A上指定的按键按下,B上的LED会亮,放开之后B上的LED会灭;乳沟B上指定的按键按下,A上的LED会亮,开放之后A上的LED会灭。看得出来,两个板子还是实现了通信控制的效果。

         再来看一下报文log,做一个粗浅的认知分析。

         两个板子初始报文发出来的速度有一些差异,可能跟板子本身硬件相关?这两个看之前文档的时候,应该是一个地址声明的过程。接下来,后面的学习分析中针对这个功能我会做一下修改和测试。值得一说的是,工具解析出来了是ACL类型。ACL就是英文Address Claiming的缩写。还有两个信息是源地址和目标地址,关于这个有如下的解释:

         因此,前面两个都是发给全局地址的广播报文。原地址分别是0x81, 0x80。

         接下来,进入今天的关注点。接下来的通信是点对点的通信,前面的3组操作是0x80发送给0x81,0x81进行相关的数据解析和动作执行。我找到了一个网络在线的J1939 ID解析工具,看看两次报文发出来的PDU Format信息。

         每一组操作,第一次的PDU Format东欧时92,第二次则是94。循环重复三组。而看看我们软件中的定义:

         正好也是这两个数值,分别对应LED灯的点亮和熄灭。看完了一个板子的报文分析,剩下的另一个其实可以暂时不去分析了,功能是完全一致的。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页