1 CAN报文解析
本章节主要对标准帧数据场中64位CAN数据如何进行解析进行讲解。
64位CAN数据(即一帧报文)我们可以理解为:8个字节(Byte),每个字节由2个16进制数组成,1个16进制数又译为4个二进制数,即1个Byte由8个Bit组成,8(Byte)x8(Bit)=64(Bit),也就是ECU实际要发送和接收的数据。
在实际的应用场景中,例如我们看到的CAN报文如下:
ID | Byte1 | Byte1 | Byte1 | Byte1 | Byte1 | Byte1 | Byte1 | Byte1 |
0x111 | 11 | 22 | D3 | 44 | 55 | 66 | 77 | 88 |
在CAN报文ID为0x111的报文中,要想知道当前ECU发送/接收到了什么数据,我们需要先在报文定义中去查看对应数据在哪个报文的哪个字节位,然后将对应字节位置的16字节数据转换为2进制(依据16进制对应2进制转换表),例如:
Byte3 | |||||||
D | 3 | ||||||
Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 |
1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 |
其中“D”为高字节,“3”为低字节,将其整体转换为2进制后,此时我们需要依照报文定义去进行换算。例如:现在要通过解析后的数据查看当前门状态是打开还是关闭?以下为门状态报文定义:
ID | 数据长度 | 字节(Byte) | 位(Bit) | 信号 | 信号值 |
0x111 | 8 | 3 | 3.4-3.5 | 门状态 | 0x0:打开 0x1:关闭 |
到这里我们需要记住,大字节是从左往右数,分别从Byte1~Byte8/Byte0~Byte7.共8个字节:1个大字节中的8个bit (位)是从右往左数,分别从Bit0~Bit7,也是共8个位,如上表:这里门状态的字节是3.4-3.5,即第3个字节的第4位到第5位,解析后的2进制数据为: 01,但是在“门状态”定义中打开和关闭是由16进制(0x)数表示的,所以这里我们又需要将2进制数“01”再次转换为16进制数,也就是“0x1”,就代表当前门是什么状态,所以最后通过报文看到的门状态为“关闭”。
2 CAN报文发送
依据CAN协议发送报文:
ID | 数据长度 | 字节(Byte) | 位(Bit) | 信号 | 信号值 |
0x222 | 8 | 3 | 3.1-3.2 | 按键状态 | 0x0:按下 0x1:未按下 |
如果当前需要发送的CAN报文“按键状态”为“未按下”,从CAN协议中可以得到要发送的数据处于第三个字节的3.0-3.1:
1.将0x2(未按下)16进制转换为2进制为1和0;
2.一个字节存在8个位,我们可以先将这8个位都想象为0,如下图:
Byte3 | |||||||
3.7 | 3.6 | 3.5 | 3.4 | 3.3 | 3.2 | 3.1 | 3.0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
3.我们此时要发送的数据处于3.0-3.1,也就是上表的最后两位,然后将0x2的2进制1和0填写进去,其余用0填充,如下图:
Byte3 | |||||||
3.7 | 3.6 | 3.5 | 3.4 | 3.3 | 3.2 | 3.1 | 3.0 |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
4.再将这8个位转换为2个16进制数,每4个位为1个16进制数,如下图:
Byte3 | |||||||
3.7 | 3.6 | 3.5 | 3.4 | 3.3 | 3.2 | 3.1 | 3.0 |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
0 | 2 |
5.其他不用的字节用0填充,最后得出要发送至总线的报文为:0x222,00 00 02 00 00 00 00 00
下章我们将进行实战讲解!