前言:汽车电子行业中最常用的CAN报文排列格式就是Motorola与INTEL了,其中Motorola又分为MSB(Most Significant bit-- 最高有效位)与LSB(Least Significant bit-- 最低有效位),顾名思义,两者的规则与标准就是对应的两家公司大力推广的技术规范,前者着重于大端字节序,后者着重于小端字节序。这两套标准可以说是各有优劣,大端字节序更适配一些网络协议且可读性高,小端字节序可以提高处理器的性能且在内存访问时更为方便。最后两者谁也没有一统江湖,而是二分了天下。作为汽车行业入门必备的知识,彻底的理解两者细节至关重要,笔者也花费了较长的时间在网上东平西凑查找东西去深入理解这些规范,下面就统一做一下整理,也针对我个人曾经遇到的问题进行特别的提一下。


目录

1,大端与小端

大端

小端

2,LSB与MSB

 3,Motorola与Intel排列格式

Motorola_MSB

Motorola_LSB

Intel

4,题外话


1,大端与小端

因为Intel与Motorola的字节排列规则与大小端的字节序紧密相关,所以要想了解这两者的具体规则,得先知道计算机概念中的大端与小端的概念。

如果用一句话概括的话那就是大端是对于一个多字节数据,高位字节 存储在内存的 低地址,而 低位字节 存储在内存的 高地址;小端就是高位字节 存储在内存的 高地址,而 低位字节 存储在内存的 低地址。

咋一听,会不会有些似懂非懂的感觉,没事,最初接触的时候我也是,直接上图。。。

  • 大端

看着应该可以明白吧,另外如果有不满一个字节的内容会使用0来填充,比如0x23456可以写为0x023456

  • 小端

哈哈,简单的看这个排列方式就是与大端的相反而已。不过话说回来在真实的内存地址当中,有时候还要考虑位序,这边我们讨论的就仅仅是字节序,不过感兴趣的小伙伴可以参考这个文章详解数据在内存中的真实存放次序:位序、字节序、大/小端模式与结构体、位域_位序 大小端-CSDN博客

2,LSB与MSB

现在我们抛却本文的要讨论的内容,单独领出来LSB与MSB来介绍一下,因为上面Motorola格式的排列有这两个的区分,所以这个还是很有必要的。

LSB(Least Significant Bit)MSB(Most Significant Bit) 是计算机科学中常用的术语,用于描述一个数字或数据单位中的位(bit)顺序。

  • MSB最重要的位,通常指的是一个二进制数中 最高位
  • 在一个二进制数中,MSB 是表示数值大小的 最重要的位,即对数值大小影响最大的位。它通常位于数值的最左边(对于普通的二进制表示)
  • LSB最不重要的位,通常指的是一个二进制数中 最低位
  • 在一个二进制数中,LSB 是表示数值大小的 最不重要的位,即对数值大小影响最小的位。它通常位于数值的最右边。

为了防止读者没有彻底的理解,虽然有些啰嗦,但还是在上一下图吧

 知道这个是比较关键的,后面我们会结合场景来介绍一下我们的两个主角

 3,Motorola与Intel排列格式

好了,前面介绍的都是铺垫,到了现在才是最关键的时候,上面我们介绍的场景是不定的,像大小端是可以针对数据的存储即各种数据在内存中的排列分布的方式,也可以针对数据在不同介质上面的传输。

现在就可以响应文章的主题了,两种数据排列都是针对在CAN总线上面的传输而言的,像这样

图有点丑,将就着看一下,CAN报文就在上面来回穿梭的

CAN传输的数据量一般是8byte,另外也有CANFD类型的是64byte。这里我们重点说一下8byte的数据传输。

一般我们使用一些专门发送与接收CAN报文的工具所呈现的格式是下面的这种:

将上面的8个字节的数据放到一个更直观的表中展现一下就是下面的图,按位数与字节数据进行排列,工具中所呈现的8个字节的数据也是下面的图中的我所标注的0xFF

就直接上图举例来说明这些格式的具体意思

  • Motorola_MSB

假设我们有一个 0x78A 的数据需要传输,换算成二进制的就是 0111 1000 1010,当然在实际中这个数据要有用一个u16的变量类型来承接,再补充上空位就是 0000 0111 1000 1010。

如果再设置其传输的起始位为30,占位为12的话,按照Motorola_MSB的排列格式具体填充就如下

箭头就是表示位展开的排列方向,其中数据的高位在低字节处

  • Motorola_LSB

依旧来使用 0x78A 来举例,如果再设置其传输的起始位为30,占位为12的话,按照Motorola_LSB的排列格式具体填充就如下

再按照二进制数据来填充一下,还是实际不满12位的在最高位上面填上0,

  • Intel

还使用 0x78A 来举例,如果再设置其传输的起始位为30,占位为12的话,按照Intel的排列格式具体填充就如下:

进一步填充字节数据如下,当然这个字节的排序就是跟上面的相反的了

好了,相信朋友们应该对这有了一个更加清晰地认识了

4,题外话

通过上面的介绍我们都知道了Motorola分为LSB与MSB,加上Intel一共是三中数据的排列规则,但是我不知道大家有没有想过一个问题就是,Intel格式的为什么没有LSB与MSB的位序之分呢?

 这个我也在网上搜了资料发现没有找到自己想要的答案,可能这个就印证了那句俗语:这是乌龟的屁股---(龟腚)规定。但是终究是不甘心,又问了一下Chat-GPT。答案如下,我也不总结了。大家看吧。。。

参考文章:

can报文排列格式--MSB、LSB、Intel_can lsb-CSDN博客

 LSb、MSb、大端、小端_lsb msb-CSDN博客

 CAN通讯中的摩托罗拉(Motorola)和因特尔(Intel)格式_motorola和intel-CSDN博客

 can报文排列格式--MSB、LSB、Intel_can lsb-CSDN博客

详解数据在内存中的真实存放次序:位序、字节序、大/小端模式与结构体、位域_位序 大小端-CSDN博客

 车载测试系列:CAN报文之Intel格式与Motorola格式 - laoluoits - 博客园 (cnblogs.com)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐