CAN信号解析流程
1.车辆CAN对应dbc文件
dbc文件一个数据包包含内容如下:
一个信号包含的有效内容:
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(十进制) 向有浮点转化 :???待补充