一、ByteOrder与Startbit
我们知道计算机存储数据是以字节(Byte)为单位的,将某个字节存入某个地址或从某个地址读出某个字节,对于单字节数据,这种处理方式简单直白没有问题,但当处理多字节数据时就会遇到问题:这些字节要按照怎样的顺序存入或读出地址空间呢?假设我们有一个uint32型的无符号四字节数据0x12345678U,还有一段为该数据开辟的地址空间,可以很容易找到两种解决方案:
方案A:从数据的最高字节开始依次放入地址空间,最高字节放在最低地址;
方案B:与方案A相反,从数据的最低字节开始依次放入地址空间,最高字节放在最高地址;
实际上方案A就是常说的Motorola格式(Big-Endian),方案B就是Intel格式(Little-Endian)。由于两种格式的字节顺序是反过来的,用Motorola格式存储的数据绝不可用Intel格式来解析,反之亦然。现在,我们将数据0x12345678U换成DBC里的信号,地址空间换成DBC里报文的数据字节位置,自然就得到了信号的两种字节序(ByteOrder)形式。
在确定了ByteOrder后,信号在报文中的位置由Startbit指定,在讲Startbit之前,需要了解下DBC对报文字节bit位的编排方式:
bit位按照从右到左、从上到下的方式编号,Byte0的bit位是7~0,Byte1的bit位是15~8,其他字节依此类推,此为第一种方式,然后,我们将上图水平镜像翻转一下:
就得到了bit位的第二种编排方式,以上两种方式是可以在Message的Layout下显现的,另外还有一种方式,将第一种进行垂直镜像翻转(Byte位置不变):
这第三种方式在Layout下是看不到的,但是会体现在Startbit的显示上(见下面的Motorola Backward)。
下面来看Startbit,根据ByteOrder不同,Startbit总共有六种显示形式,其中Motorola有四种,Intel有两种。假设有一条总长(DLC)为4字节的报文,包含一个长度12bit的信号,我们来看下这6种形式有什么区别:
1. Motorola Forward LSB:
首先Motorola格式决定了信号的高4bit位在前(Byte1),低8bit位在后(Byte2),然后Forward可理解为从前向后(正向)找到lsb所在的位置即为信号的起始位,这里为Bit16。
2. Motorola Forward MSB:
和上一种唯一的区别是用信号msb所在位置(Bit11)作为起始位。
3. Motorola Backward:
Backward可理解为从后往前(反向)找到lsb所在位置(bit8)作为信号的起始位,注意这里使用bit位编排的第三种方式。
4. Motorola Sequential:
Sequential可理解为正序查找,这种比较符合我们计数习惯,从上到下、从左到右(bit位编排第二种方式)计数找到msb所在位置(bit12)作为信号的起始位。
5. Intel Standard: