学习自记:
在定义CAN通信矩阵或制作dbc时,我们需要知道报文的字节排列顺序。字节的排列顺序有2种,一种是Intel的排列顺序,另一种是Motorola的排列顺序,就跟大小端字节排序是一样的。下面笔者将简单介绍这2种字节排序的区别。
Intel格式:
Intel格式跟小端格式一样,低地址代表低字节,高地址代表高字节。比如一个信号Intel,它的起始位为3,长度为10,在dbc中它的排列顺序如下所示:
要注意其箭头的增长方向,这样我们在提取该信号的值为
Intel = (byte0 >> 3) + (byte1 << 5)
其中(byte0 >> 3)为低字节的值,(byte1 << 5)为高字节的值。
Motorola格式:
Motorola格式跟大端格式一样,低地址代表高字节,高地址代表低字节。与Intel不一样,Motorola格式有2种表达方式,一种是Motorola_LSB,另一种是Motorola_MSB,但实际上它们代表的数据结构是一样的,只是表达方式不一样而已,其中Motorola_LSB的起始位是从低字节开始的,而Motorola_MSB的起始位是从高字节开始的。在dbc中,比如一个Motorola_LSB的信号MotorolaSignal,其起始位为10,长度为10,在dbc中,其排列顺序如下所示:
要注意其箭头的增长方向,这样我们在提取该信号的值为
MotorolaSignal= (byte1 >> 2) + (byte0 << 6)
其中(byte1 >> 2)为低字节的值,(byte0 << 6)为高字节的值。
该MotorolaSignal信号用Motorola_MSB表示则为起始位为3,长度为10,但其值的计算方式跟Motorola_LSB是一样的。