获取CAN报文并解析

一、获得CAN报文的过程

准备软硬件环境,硬件周立功CAN卡,软件使用ZLGCANTest,安装在电脑上;通过CAN卡连接整车CAN或者调试端口,通过软件交互界面获取CAN报文。

二、CAN2.0B报文基本格式

接收到的报文,是一串十六进制的字符,而报文格式定义和位数是按照二进制定义的。29位扩展标识符,报文帧格式如下图所示。表格中,上面一行为字段代号,下面一行表示字段的位数。SA为报文的源地址,有8位。

三、报文基本组成

初始能够获得的是帧ID的一串字符,就是前面的29位扩展标识符,通过帧ID找到目标所在行,进而找到数据段。数据段包含的信息,是我们需要的部分。

IDENTIFIER 11BITS

SRR

IDE

IDENTIFIER EXTENSION 18BITS

 

R

DP

PDU

FORMAT(PF)

SRR

IDE

PF

PDU

SPECIFIC(PS)

SOURCE

ADDRESS(SA)

3

2

1

1

1

8

7

6

5

4

3

 

 

2

1

8

7

6

5

4

3

2

1

8

7

6

5

4

3

2

1

8

7

6

5

4

3

2

1

0

9

8

 

 

7

6

5

4

3

2

1

0

9

8

7

6

5

4

3

2

1

0

以上为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。

例如 :

OUT

IN

ID

周期

BMS

仪表/车载终端

0x18B1D0F4

200ms

位置

数据名

备注

BYTE1

电池总电压低字节

0.1V/bit

数据范围:0-10000(0-1000V)

BYTE2

电池总电压高字节

BYTE3

电池系统电流低字节

0.1A/bit, 偏移:-400

数据范围:0-8000(-400~400A)

BYTE4

电池系统电流高字节

BYTE5

最高电池温度

1℃/bit,偏移-40℃

数据范围:0-250(-40℃-210℃)

BYTE6

最低电池温度

BYTE7

电池系统剩余电量

1%/bit, 数据范围:0-100(0-100%)

BYTE8

电池系统故障

见附表4-1

 五、具体CAN报文解析过程

收到的报文为: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。

原文地址:https://www.cnblogs.com/schyzhkj/p/13044962.html