CAN报文解析详解
CAN报文解析详解
CAN(Controller Area Network)总线是一种用于汽车电子和工业控制领域的串行通信协议。在汽车电子系统中,CAN总线被广泛应用于传感器数据传输、执行器控制等场景。本文将详细介绍CAN报文的解析过程,包括总线值与物理值的转换、Intel格式和Motorola格式的区别,以及具体的报文解析步骤。
1、CAN报文介绍
在发送报文之前,我们要如何向报文内填充内容?在获取到一帧CAN报文后,我们要如何解析它?
CAN报文有两部分很关键:帧ID;帧数据;
CAN报文的帧ID分为扩展帧和标准帧。帧数据也就是CAN报文里面的数据段,对于普通CAN而言,数据段总共能存储1~8个byte的数据。
不知道什么是扩展帧标准帧、帧数据的小伙伴,可以参考相关资料。
2、总线值与物理值
要学习解析CAN报文之前,我们要先了解物理值和总线值的概念。
- 物理值(Physicl):物理值很好理解,就是具有实际物理意义的值,比如温度、电压、扭矩等。
- 总线值(Raw):总线值也叫做原始值,顾名思义,这个是传输到CAN总线上面的值。
根据国际标准,物理值和总线值按照特定公式相互转换:
[Physicl value] = [Raw value] *[Factor] + [Offset]
物理值 = 总线值 x 系数 +偏移量
[Raw value] = ([Physicl value] - [Offset] ) / [Factor]
总线值 = (物理值 - 偏移量)/ 系数
举个例子:当我们知道环境温度为 23℃,Foctor = 0.1,Offset = -40;如何获取它的总线值。
直接套用公式:
Raw = ([Temperature value] - Offset)/[Foctor] = (23 - (-40))/0.1=630 = 0x0276。
3、Intel格式和Motorola格式
要学习解析CAN报文之前,我们还需要先了解什么是Intel格式和Motorola格式。
- Intel:Intel遵循的是LSB(Least Significant Byte)格式,信号的高位放在高字节,信号的低位放在低字节。
- Motorola:Motorola遵循的是MSB(Most Significant Byte)格式,信号的高位放在低字节,信号的低位放在高字节。
如果某个信息只占据一个字节,不涉及字节的顺序,Motorola 和 Intel 是一样的。但是如何涉及到跨字节的信息,那么这两种格式是完全不一样的。
如果某个信息占据了 Byte0 和 Byte1 两个字节,Motorola 是 MSB,先发高位(即 Byte0 就是高位),所以其解析的顺序是 Byte0 Byte1,而 Intel 恰好是反过来:Byte1 Byte0。
举个例子:byte0=0x02,byte1=0x76,byte0和byte1组合起来是温度信号的总线值,总共两个字节。如果我们按照Motorola的格式去解析的话,低字节在前高字节在后,组合起来就是0x0276。如果我们按照Intel的格式去解析的话,高字节在前低字节在后,组合起来就是0x7602。
4、CAN报文解析
假如我接收到一帧报文,报文Id是0x01,数据域为 02 00 00 C8 00 D0 07 01。我应该如何去解析它呢?
通信协议(通信矩阵)
当我们想要解析这一帧报文时,我们需要先获取发送方制定的CAN报文解析规则。如果收发双方没有按照双方约定规则去填充或解析CAN报文,那么收发双方的数据交互一定会出问题的。CAN报文在发送和接收前,我们都会按收发双方约定好的规则去填充数据与接收解析数据。约定好的这个规则我们一般称之为CAN通信协议(也称为CAN通信矩阵)。
当我获取到下图的通信协议后,那么我就可以去解析数据了。
根据通信协议可知,报文ID 0x01,这一帧报文是电池组控制参数,它是由VCU(整车控制器)发给BMS(电池管理系统)的。
我们接收到的报文信号 id:0x01,data:02 00 00 C8 00 D0 07 01。可知 byte0的数据为0x02,也就是bit7~0依次为 0 0 0 0 0 0 1 0,其中bit0 = 0,bit1=1。
- 数据域的第0位,也就是byte0的第0位为主继电器吸合的使能信号,此时bit0=0,说明此时主继电器吸合的使能信号为Disable;
- 数据域的第1位,也就是byte0的第1位为低压电上电使能信号,此时bit1=1,说明此时低压电上电使能信号为Enable;
- 数据域的第8
23位,也就是byte1byte2为母线电压请求值,byte1和byte2组合起来为0x0000,是母线电压请求值的总线值,换算为物理值为0。母线电压请求值=0V; - 数据域的第24
39位,也就是byte3byte4为低压电压请求值,因为此通信协议遵循Intel格式解析数据。byte3= C8,byte4=00,按照Intel格式(LSB)组合起来就是 0x00C8,其物理值= 0x00C8 * 0.1 + 0 = 20。低压电压请求值=20V; - 数据域的第40
55位,也就是byte5byte6为母线电流限制值,因为此通信协议遵循Intel格式解析数据。byte5= D0,byte6=07,按照Intel格式(LSB)组合起来就是 0x07D0,其物理值= 0x07D0 * 0.1 - 2000 = -1800。母线电流限制值为-1800A; - 数据域的第56~57位,也就是byte7为消息计数器的值,因为处于同一个byte,所以不需要区分motorola和Intel格式,Count值为1。
以上就是id:0x01,data:02 00 00 C8 00 D0 07 01这一帧报文的解析的全过程。
5、总结
只要我们会看CAN报文收发双方规定好的CAN通信协议(CAN通信矩阵),了解总线值与物理值之间的相互转换,并且知道Motorola和Intel格式的区别,那么我们就可以很容易的把CAN报文解析出来。