CAN报文解析
CAN报文解析
一、获得CAN报文的过程
准备软硬件环境,硬件周立功CAN卡,软件使用ZLGCANTest,安装在电脑上;通过CAN卡连接整车CAN或者调试端口,通过软件交互界面获取CAN报文。
二、CAN2.0B报文基本格式
接收到的报文,是一串十六进制的字符,而报文格式定义和位数是按照二进制定义的。29位扩展标识符,报文帧格式如下图所示。表格中,上面一行为字段代号,下面一行表示字段的位数。SA为报文的源地址,有8位。
三、报文基本组成
初始能够获得的是帧ID的一串字符,就是前面的29位扩展标识符,通过帧ID找到目标所在行,进而找到数据段。数据段包含的信息,是我们需要的部分。
以上为29 标识符的分配表:
其中,优先级为3 位,可以有8 个优先级;R 一般固定为0;DP 现固定为0;8 位的PF 为报文的代码;8 位的PS 为目标地址或组扩展;8 位的SA 为发送此报文的源地址。
四、数据段的组成
数据段由8个字节组成,对应通信协议中约定的含义。每个字节有2个字符,前边字符代表高4位,后边字符代表低4位。
例如,一串报文1818D0F3 ce 0d 00 7d 00 6d 1100(ID是1818D0F3)。第1个字节ce中的c为高4位,e为低4位。如果通讯协议规定,第1、2字节表示总电压,而且注明Byte1为低字节,Byte2为高字节,那么解析时就应该为:0dce。
例如 :
收到的报文为:1818D0F3 ce 0d 00 7d 00 6d 11 00。
第一、二字节,协议中规定了,1818D0F3 ID帧内,第一、二字节表示电压,并且,高字节表示高字节表示电压数值的高位,低字节表示电压数值的低位,比例因子0.1V。
数据中0dce代表总电压,转为十进制为3534,乘以0.1 V的单位,则得到总电压值为353.4 V。
第三、四字节,协议中规定报文的第三、四字节表示总电流,又总电流的单位为0.1 A,偏移量为32000。数据中7d00转为十进制为32000,乘以0.1再减去3200的偏移量0,则说明此时电池组没有被充电或放电,电流为0。
第六、七字节,协议中规定报文的第六、七字节表示最高单体电池电压及位置。单体电池电压单位为0.01 V,最高4位代表箱号。数据中116d,其中1代表箱号,即最高电池电压在第1箱。16d代表最高电池电压,转为十进制为365,乘以0.01 A的单位,则得到最高电池电压为3.65 V。
十六进制转换成十进制数的方法,从最低位开始,16的0次方加第一位+16的1次方加第二位数……比如前文中的116d,最高4位代表箱体编号,16^0+1=1,因此箱体号为1;后面的12位代表单体电压,计算方式(16^0+13)+(16^1+6)+(16^2+1)=365,算式中的13是报文中的d。
CAN报文:
https://blog.csdn.net/LiuXF93/article/details/113729294
CAN报文:数据帧详解
https://blog.csdn.net/u010650845/article/details/125990942