问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

CAN报文解析详解

创作时间:
作者:
@小白创作中心

CAN报文解析详解

引用
CSDN
1.
https://blog.csdn.net/m0_73331507/article/details/140164782

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;
  • 数据域的第823位,也就是byte1byte2为母线电压请求值,byte1和byte2组合起来为0x0000,是母线电压请求值的总线值,换算为物理值为0。母线电压请求值=0V;
  • 数据域的第2439位,也就是byte3byte4为低压电压请求值,因为此通信协议遵循Intel格式解析数据。byte3= C8,byte4=00,按照Intel格式(LSB)组合起来就是 0x00C8,其物理值= 0x00C8 * 0.1 + 0 = 20。低压电压请求值=20V;
  • 数据域的第4055位,也就是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报文解析出来。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号