CAN信号解析流程

1.车辆CAN对应dbc文件

dbc文件一个数据包包含内容如下:

车辆CAN信号,依据DBC文件解析流程-LMLPHP

 一个信号包含的有效内容:

2.解析步骤

3.解析精度说明

针对dbc信号不同类型信号解析的精度说明。

目前dbc信号数据类型有:

Unsigned、Signed需精度控制类型说明:

针对这两类的信号数据精度,可采用整形,浮点型。

针对这两类的信号数据精度要求浮点型,则有Float和Double如下考虑:

Float和Double同样是两种浮点数类型。其中Float占用4个字节(32位),Double占用8个字节(64位)。

在精度方面:Double类型的精度要比Float类型高。Double类型可以表示的范围更广,小数点后的位数也更多,因此可以更精确地表示小数。

在使用性能方面:由于Double类型占用的内存空间更大,因此在处理大量浮点数运算时,Double类型的计算速度会比Float类型慢。

推荐高性能计算使用:Float类型

推荐高精度计算使用:Double类型

4.示例

Signed类型解析:

接收数据包的值为:f4 fc 00 00 00 00 00 00 (此数据包为16进制)

1. 获取信号所需信息

{
    "start_bit": 0,
    "bit_length": 16,
    "factor": 0.1,
    "offset": 0,
}

2. 判断数据是否需进行字节序转换

考虑底层(mcu)是否统一发送格式,统一大端或者小端,请于底层进行确认!!

当前内容需进行大小端转换。

f4 fc 00 00 00 00 00 00 == 》》00 00 00 00 00 00 fc f4

3. 获取信号的十进制值

将获取的数据转化为二进制;

根据:start_bit 以及 bit_length,从信号的 bit 0 位 开始,取出总长度为 16 的数据串,并且转化为十进制数据值。

4. Signed需要向有符号转化

此处需将无符号转化为有符号数据。

当前使用取反加1法进行转化,(此外还有符号位扩展法,补码表示法)

将十进制值 转化为 二进制 并且 进行取反加1法,再转化为十进制

即-780

5. 根据公式进行计算信号实际值

根据计算公式:即可得出 signal = (-780 * 0.1)+ 0.0 = -78.0

所以接收到 signal 数据值为 -78

Unsigned类型解析:

接收数据包的值为:cc 0c 00 00 00 00 00 00 (此数据包为16进制)

1. 获取信号所需信息

{
    "start_bit": 1,
    "bit_length": 15,
    "factor": 0.01,
    "offset": 0,
}

2. 判断数据是否需进行字节序转换

考虑底层(mcu)是否统一发送格式,统一大端或者小端,请于底层进行确认!!

当前内容需进行大小端转换。

cc 0c 00 00 00 00 00 00 ==》》00 00 00 00 00 00 0c cc

3. 获取信号的十进制值

将获取的数据转化为二进制;

根据:start_bit 以及 bit_length,从信号的 bit 1位开始,取出总长度为 15 的数据串,并且转化为十进制数据值。

4. Unsigned不需要向有符号,浮点型转化,跳过。

5. 根据公式进行计算信号实际值

根据计算公式:即可得出 signal = (1638 * 0.01)+ 0.0 = 16.38

所以接收到 signal 数据值为16.38

Double、Float类型解析

Double、Float类型解析同Signed类型解析流程。

需要注意流程 4向有符号,浮点型转化,这块步骤有所差异,请注意。

类型转化说明

64756(十进制) 向有符号转化 : 二进制取反加1  ==》-780

64756(十进制) 向有浮点转化 :???待补充

05-30 10:36