参考来源:https://blog.csdn.net/2301_79031315/article/details/134891935
1. CAN报文是Intel格式还是Motorola格式,只在单个信号跨字节时,解析才有区别。
当一个信号的数据长度不跨字节的时候(相当于在一个字节内,或者说是can矩阵列表的一行,没有跨越两行),Intel 与 Motorola 两种格式的编码结果完全一样。
当一个信号的数据长度跨字节的时候(相当于在两个字节及以上,或者说是can矩阵列表的两行及以上,并没有说一定要把两行都占满),两者的编码结果出现了明显的不同。 Intel 实施的是信号数据的高位在can矩阵列表的高字节的高位,信号数据的低位在can矩阵列表的低字节的低位。而Motorolla格式相反,实施的是信号数据的高位在can矩阵列表低字节的高位,信号数据的低位在can矩阵列表的高字节低位。
CAN dbc 的编码格式有两种,Intel和Motorola,两者的区别仅仅在于数据的排序上。
CAN信号若是包含8个字节,Byte0到Byte7,每个字节有8个bit,也是0到7。从单个字节来讲,都是左边是高位MSB,右边是低位LSB。
LSB(Least Significant Bit)–最低有效位,LSB是一个二进制数字中的第0位(即最低位)
MSB(Most Significant Bit)–最高有效位,MSB是一个n位二进制数字中的n-1位(即最高位)
2. Intel 格式的数据,四个信号,layout如下图。
A_len_4 (startbit为 0,长度 4), 它的范围就是bit 0到bit3,
B_len_8 (startbit为 8,长度 8), 它的范围就是bit 8到bit15,
C_len_14 (startbit是16,长度14),它的范围就是bit16到bit29,
D_len_16 (startbit是32,长度16),它的范围就是bit32到bit47,
3. Motorola 格式的数据,四个信号,layout如下图。
A_len_4 (startbit为 0,长度 4), 它的范围就是bit 0到bit3,
B_len_8 (startbit为 8,长度 8), 它的范围就是bit 8到bit15,
C_len_14 (startbit是24,长度14),它的范围就是bit24到bit21,
D_len_16 (startbit是40,长度16),它的范围就是bit40到bit39,
4. 总结:
4.1 当一个信号的数据长度不跨can矩阵的行时候(也就是,一个信号的数据在can矩阵列表里面,能用一行装载的时候),Intel 与 Motorola 两种格式的编码结果完全一样。
单字节时,程序中结构体的定义都是从字节的低位到字节的高位。
4.2 当一个信号的数据长度跨can矩阵的行时候(也就是,一个信号的数据在can矩阵列表里面,需要用两行装载的时候),两者的编码结果出现了明显的不同:
跨字节时,Intel格式,消息里面的信号数据定义:信号的数据低字节放在can矩阵列表里面的低字节,信号的数据高字节放在can矩阵列表里面的高字节。
跨字节时,Motorola格式,消息里面的信号数据定义:信号的数据低字节放在can矩阵列表里面的高字节,信号的数据高字节放在can矩阵列表里面的低字节。
无论跨不跨字节,在can矩阵列表一行中,信号的数据低位放在can矩阵列表一行的低位,信号的数据高位放在can矩阵列表一行的高位。