0 字节序概念
字节序(Byte Order)是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。
在计算机中是以字节为单位,每个地址对应一个字节,一个字节8bit。在C中,除了8bit的char以外,还有16bit的short,32位的int,64位long,当然具体要由编译器决定,可以通过sizeof来获取不同类型在内存中占用的字节数。在计算机系统中,当物理单位的长度大于1个字节时,就要区分字节顺序。
常见的字节顺序有两种:大端(Big-endian)和小端(Little-endian),当然还有其他字节顺序,但不常见,例如Middle Endian。
1 高低与大小
高位与低位:
在常用的十进制数中,比如123456,那么最左边就是高位,最后边就是低位。
高字节与低字节:
假设一个16进制数:0x123456,高字节为0x12,低字节为0x56。
高地址与低地址:
在内存中,多字节对象都是被存储为连续的字节序列。假设将数据在内存中的起始地址(首个字节存储位置)为0x0000。
大端和小端:
大端:高字节存放在低地址,低字节存放在高地址
小端:低字节存放在低地址,高字节存放在高地址
以0x123456为例:
- 以上均为字节序,位序也有大小端之分,假设一个字节0x12,其二进制为0001 0010。一般来说位序与字节序相同:
2 CAN总线中的字节序
汽车行业的工程师,尤其是从事软件、标定、测试等相关工作的,肯定对 CAN 报文的解析比较熟悉。解析前首先要确认 CAN 信息的顺序,否则遇到跨字节的信息,得到的结果就完全错了。
无论是标准帧还是扩展帧,其数据域最长为 8 字节,报文所包含的主要信息就包含其中,需要按照既定的协议解析,这也是汽车工程师最关心的内容。
CAN的位序与字节序:
- 位序和字节序都有大端和小端,共有四种:
1 msb: most significant bit
2 lsb: least significant bit
3 MSB: Most Significant Byte
4 LSB: Least Significant Byte
CAN总线协议中规定,位序都是大端模式,即 msb first,因此不需要区分。但对字节序没有规定,就出现了两种情况:Motorola 和 Intel 格式。
Motorola 格式就是 MSB
Intel 格式就是 LSB
如果某个信息在占据一个字节,不涉及字节的顺序,Motorola 和 Intel 是一样的。而涉及到跨字节的信息,两者就完全不同了。
如果某个信息占据了 Byte0 和 Byte1 两个字节:
Motorola 是 MSB,先发高位(即 Byte0 就是高位),所以其解析的顺序是 Byte0 Byte1。
而 Intel 恰好是反过来:Byte1 Byte0。
CAN的传输字节序:
CAN 总线上位序都是大端模式(msb),字节序可选,可以是Intel(LSB )或者是Moto(MSB)
DBC 上的标号其实是Intel,但是当有具体信号时,DBC会有msb和lsb的标注。
假设发送8字节数据为0x12 34 56 78 9a bc de f0:
Can总线上数据的传输序从第0字节发送,到第7字节结束字节序是
第0字节 第1字节 第2字节 第3字节 …….第7字节,
所以传输顺序为:
0x12、0x34、0x56、0x78、0x9a、0xbc、0xde、0xf0。
字节内部从高位发
第0字节:第0位 第1位 第2位…第7位
所以第0字节的传输顺序为:
0、0、0、1、0、0、1、0。
下面是使用CAN总线传输一个4Byte的数据:
参考:
https://www.cnblogs.com/mghhzAnne/p/15488509.html
https://blog.csdn.net/qq_44333320/article/details/125417408