CAN 报文字节排列顺序(Intel、Motorola_LSB、Motorola_MSB)

       在定义CAN通信矩阵或制作dbc时,我们需要知道报文的字节排列顺序。字节的排列顺序有2种,一种是Intel的排列顺序,另一种是Motorola的排列顺序,就跟大小端字节排序是一样的。下面笔者将简单介绍这2种字节排序的区别。

 

Intel格式:

       Intel格式跟小端格式一样,低地址代表低字节,高地址代表高字节。比如一个信号Intel,它的起始位为3,长度为10,在dbc中它的排列顺序如下所示:

CAN 报文字节排列顺序(Intel、Motorola_LSB、Motorola_MSB)_第1张图片

要注意其箭头的增长方向,这样我们在提取该信号的值为

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的表达格式,没有Motorola_MSB的表达格式,比如一个Motorola_LSB的信号MotorolaSignal,其起始位为10,长度为10,在dbc中,其排列顺序如下所示:

CAN 报文字节排列顺序(Intel、Motorola_LSB、Motorola_MSB)_第2张图片

要注意其箭头的增长方向,这样我们在提取该信号的值为

MotorolaSignal= (byte1 >> 2) + (byte0 << 6)

其中(byte1 >> 2)为低字节的值,(byte0 << 6)为高字节的值。

该MotorolaSignal信号用Motorola_MSB表示则为起始位为3,长度为10,但其值的计算方式跟Motorola_LSB是一样的。

 

你可能感兴趣的:(汽车电子协议)