项目要用到ASEJ1939的协议,看了很多网上的博客,发现没有特别详细的,有些写的我都看不懂,理论一大堆。硬着头皮粗粗学了一下,大致摸出了点门道,就此记录一下,以免以后用忘记了。
先上图最小数据结构pdu 打开SAE+J1939-21-2001文档可以获得
P:优先级,决定该 PDU 进入总线的优先权限。值越小则优 先级越高。
R:预留的 基本为0
DP:数据页,这是 PGN 装载的一个位置,超过 65536 后该 位才会被置 1,现在一般的项目基本用不到,除非航天航空才会用到这么多pgn。
PF:PDU 格式(PDU Fomat),PGN 装载的位置,PDU 格式分为 PDU1 和 PDU2,小于240的是PDU1 格式的,大于等于240就是PDU2格式的。
PS:PDU 特征(PDU Specific),PF是PDU1时该域存放的是目标地址(DA:Destination Address),如果 PF 是 PDU2 时,该域 存放 PGN 扩展(GE:Group Extension)。
SA:源地址(Source Address),和目标地址相对,发送和接收的时候用的。
DATA Field:发送和接收的内容,发送的时候是pgn 接收就是回应的数据。
下面开始进入正题
介绍完了这个PDU,然后就是实战应用了。
首先拿一个练练手,遇到什么就讲什么。
如下是一个申请车轮转速的请求,我们来拆解下
18EA00F9 BF FE 00 F9(诊断设备)向00(发动机)请求车轮转速
18:这是前面的优先级什么的,不用管pass。
EA:这个是申请的pgn 具体可以找对应的文档SAE+J1939-21-2001如下图,
00:因为前面EA小于240 所以是PDU1 格式的,当前这个就是一个目标地址,00表示的是发送机,这个可以参考SAE+J1939-2005这个文档的Table B2,
当然下面的源地址也是要通过这个来找的。
F9:源地址,因为我们当前的是一个诊断设备,所以Table B2 中是249 也就是F9。
然后就是对应的pgn,BF FE 00 这里的实际值应该是0x00febf 因为协议里的是小端模式,低位放在前。
0xfebf 要去SAE+J1939-71-2006 这个文档下找,如下图,可以看到是wheel speed
申请数据的指令讲完了,就开始分析收到的指令
18FEBF00 00 00 00 00 00 00 00 00
这个简单说下就是 优先级+pgn0xfebf +源地址(来自发动机的) 后面的数据就是具体的车轮的转速。因为当时没有转动轮子,得到的全是0.
就是按照上图下面的8byte去依次解析得到数据。
开始增加难度
接下来个难点的。这是一个获取故障码的请求,和这个也差不多我们来拆解
18EAFFF9 CA FE 00 1CECFF00 20 16 00 04 FF CA FE 00 1CEBFF00 01 00 FF FD 03 01 02 FE 1CEBFF00 02 03 01 02 FF 03 01 02 1CEBFF00 03 00 04 01 02 01 04 01 1CEBFF00 04 02 00 00 00 00 00 00
第一条就不用分析了,不过后面这个故障码pgn,在SAE+J1939-71-2006找不到 要去SAE+J1939-73-2004 这个文档里去找。
首先要知道J1939的数据传输。
数据传输的时候会有2种类型 一种是bam 姑且叫他广播模式 一种是RTS/CTS 这里可以简单理解成tcp通信。具体的还是要看文档SAE+J1939-21-2001,
下面这个图是判断这个指令是bam还是rts 这里一定要看英文的文档,翻译过来的文档根本不靠谱。
我们按这个图来分析一下当前这个指令是什么传输的
18EAFFF9 CA FE 00
被请求的pgn是00FECA FE大于240 是pdu2,数据长度大于8byte,请求地址F9 特定地址 响应地址FF全局 按照上图得知是倒数第二个bam
也可以通过第二条传输明明看出
1CECFF00 20 16 00 04 FF CA FE 00
后面的消息是 20 16 00 04 FF CA FE 00 怎么分析这个呢? 可以参考文档SAE+J1939-21-2001的FIGURE 14 FORMAT OF MESSAGES FOR TRANSPORT PROTOCOL 因为之前判断是bam所以就是下面的箭头 byte=32 也就是16进制的0x20.
这里主要的就是他们交互的关系
具体的去看一下 SAE+J1939-21-2001的 TRANSPORT PROTOCOL TRANSFER SEQUENCES
图有点多就放1个当前讲的这个例子吧。
下面就直接注释搞起了 ,感觉分开分析有点麻烦。
18EAFFF9 CA FE 00 1CECFF00 20 16 00 04 FF CA FE 00 TP.CM_BAM 就是下图,然后各个byte的解释 20表示bam 16 00 表示有22个数据 04 4个包 CA FE 00 pgn 1CEBFF00 01 00 FF FD 03 01 02 FE TP.DT 图也放下面了 01 队列数 然后就是数据 1CEBFF00 02 03 01 02 FF 03 01 02 1CEBFF00 03 00 04 01 02 01 04 01 1CEBFF00 04 02 00 00 00 00 00 00
然后这bam的解析就算全部完成了。。。
再加一个rts的吧,读取车架号 参考下面的图
18EA00F9 EB FE 00 F9 向00 发送车架号请求 1CECF900 10 2C 00 07 FF EB FE 00 TP.CM_RTS 44个数据 07个包 EB FE 00 pgn 1CEC00F9 11 07 01 FF FF EB FE 00 TP.CM_CTS 07个包 下个发送的包01 EB FE 00 pgn 1CEBF900 01 4E 4C 43 49 44 2A 31 包的序列 01 数据 1CEBF900 02 32 33 34 35 36 37 38 1CEBF900 03 39 41 42 43 44 45 46 1CEBF900 04 47 48 2A 31 32 33 34 1CEBF900 05 35 36 37 38 2A 31 32 1CEBF900 06 33 34 35 36 37 38 39 1CEBF900 07 41 2A FF FF FF FF FF 包的序列 07 数据 结束了 1CEC00F9 13 2C 00 07 FF EB FE 00 TP.CM_EndOfMsgACK 44个数据 07个包 EB FE 00 pgn
完结撒花!!!!!
应该来说把ASEJ1939的应用层的大部分都解释完了。我目前的开发也就用到这么多了把,还有补充那就等下次了。
相关的J1939协议文档放百度网盘
链接:https://pan.baidu.com/s/1RGvenTdF5BECX6ceBLGL9w
提取码:t03m
标签:02,00,01,04,ASEJ1939,FE,FF,解析,关于 From: https://www.cnblogs.com/yepc/p/16641476.html