CAN报文定义
CAN报文是指发送单元向接受单元传送数据的帧。我们通常所说的CAN报文是指在CAN线(内部CAN、整车CAN、充电CAN)上利用ECU和CAN卡接收到的十六进制报文。
CAN编码格式(Intel、Motorola)
CAN总线数据传输规则
对于单个Byte,CAN总线在进行数据传输时,首先传输一个字节的高位(MSB),最后传输该字节的低位(LSB)。
一般情况下,主机厂在定义CAN总线信号的时候,都会明确定义字节的发送顺序,总共有两种顺序:1.首先发送byte0(LSB),然后byte1,byte2,…,最后byte7(MSB)。
2.首先发送byte7(MSB),然后byte6,byte5,…,最后byte0(LSB)。
其中前者发送顺序(先LSB,后MSB)是目前主机厂的主流。
下面以CAN总线报文的发送顺序为首先发送LSB,最后发送MSB的方式为前提,介绍Intel格式和Motorola格式这两种编码方式的不同。
Intel格式编码
当一个信号的数据长度不超过1 Byte,并且信号在一个字节内实现时,该信号的高位(S_msb)将被放在该字节的高位,信号的低位(S_lsb)将被放在该字节的低位。
当一个信号的数据长度超过1 Byte或者数据长度不超过1 Byte,但是采用跨字节的方式实现时,该信号的高位(S_msb)将被放在高字节(MSB)的高位,信号的低位(S_lsb)将被放在低字节(LSB)的低位,这样信号的起始位就是低字节的低位。
Motorola格式编码
当一个信号的数据长度不超过1 Byte并且信号在一个字节内实现时,信号的高位(S_msb)将被放在该字节的高位,信号的低位(S_lsb)将被放在该字节的低位,这样,信号的起始位就是该字节的低位。
当一个信号的数据长度超过1 Byte或者数据长度不超过一个字节但是采用跨字节方式实现时,该信号的高位(S_msb)将被放在低字节(MSB)的高位,信号的低位(S_lsb)将被放在高字节(LSB)的低位,这样信号的起始位就是高字节的低位。
注意
当一个信号的数据长度不超过1 Byte时,Intel和Motorola两种格式的编码结果完全一致,但是当数据长度超过1 Byte时,两者的编码结果出现了明显的不同。
CAN协议中CAN报文种类
报文传输过程中有:数据帧、远程帧、错误帧、过载帧和帧间隔。
CAN报文的组成
通常接收到的CAN报文由很多部分(图1)组成,解析报文时用到的主要是帧ID和数据两部分。
帧ID的组成
接收到的十六进制的ID实际上是由 29 位标识符转换而来,目前大多数的通信协议中都直接给出了相应的帧ID,不需要换算。如表 1 所示。
表1中,P为优先级,有3位,可以有8个优先级( 0 ~ 7 );R为保留位,有 1位,固定为0 ;DP为数据页,有1位,固定为0;PF为报文的代码,有8 位;PS为报文的目标地址(也就是报文的接收方),有8位;SA为报文的源地址(也就是报文的接收方),有8位。
数据段的组成
数据段一般由1 ~ 8个字节(Byte)组成,来代表通信协议中相应的含义。每个字节有2个字符,分为高4位和低4位。有的数据需要相邻的2个字节组合才能表示,则需要分为高字节和低字节。
例如 ,通信协议中需要的报文(ID:0000060B ): 0000060B 57 4e 01 7d 00 6d 11 00 。
第 1 个字节57中的5为高 4 位,7为低 4 位。第 1 、 2字节表示横向距离,而且注明Byte 1 为低字节,Byte 2 为高字节,那么解析时就应该为: 4e57。
CAN报文的解析
根据需要收到CAN报文之后,需要根据具体的通信协议解析,然后分析解析出的数据是否正确。下面进行报文实例解析。数据类型定义如表 所示。
解析实例:
我们看到有8个signal。分别是ID、纵向距离、横向距离、纵向速度、横向速度、动态属性、RCS、class(在这里没用)。
拿纵向距离跟横向距离解释一下:
目标纵向距离:
这个signal有13个位组成,字节1为 0x4E*32的意思是向左移动5位,(2的5次幂是32),0xc4<<3是右移三位,跟上面的字节对齐,相加形成一个13位的信号。
目标横向距离:
文章来源:https://www.toymoban.com/news/detail-401194.html
0xc4与上0x70是保留后三位。乘以256(2的8次幂是256)是左移8位,给下面的8为字节留地方(补0)。
文章来源地址https://www.toymoban.com/news/detail-401194.html
到了这里,关于CAN报文解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!