Modbus大小端

“大小端”(Endianness)指的是多字节数据在内存中存储或在网络上传输时的字节顺序(Byte Order)

简单来说,当一个数据很大,需要拆成多个字节(Byte)来表示时,是先放高位字节(大端),还是先放低位字节(小端)。

为什么会有“大小端”?

在计算机里,最小的存储单元是字节(1 Byte = 8 bits)。

  • 如果你要传输一个字节的数据(比如十进制的 18,十六进制为 0x12),那不需要考虑顺序。
  • 但 Modbus 的保持寄存器(4xxxx)每个寄存器是 16 位(2 个字节)。如果你要传输一个 16 位的数据,或者一个 32 位的浮点数(占 2 个寄存器),就必须决定哪个字节在前,哪个字节在后。

大端与小端的区别

假设我们要传输一个 16 位的十六进制数:0x1234。 这个数据由两个字节组成:高位字节(MSB)是 12,低位字节(LSB)是 34。

1. 大端模式 (Big-Endian)

  • 概念:符合人类的阅读习惯。高位字节存放在低地址(先发送),低位字节存放在高地址(后发送)。
  • 传输顺序:先发 12,再发 34。
  • 特点:Modbus 标准协议默认就是大端模式。

2. 小端模式 (Little-Endian)

  • 概念:很多主流的 CPU(如 Intel、ARM、STM32 等)在内部内存中倾向于使用小端。低位字节存放在低地址(先发送),高位字节存放在高地址(后发送)。
  • 传输顺序:先发 34,再发 12。

32 位数据(如浮点数)的“混合端”

在 Modbus 中读取 32 位数据(如 float 或 int32)时,情况会更复杂一点,因为涉及 2 个寄存器(4 个字节)。假设数据是 0x12345678,常见的排列组合有 4 种:

  • Big-Endian (ABCD):12 34 56 78(标准大端)
  • Little-Endian (DCBA):78 56 34 12(标准小端)
  • Little-Endian Byte Swap (CDAB):56 78 12 34(字节交换,也叫后大端)
  • Big-Endian Byte Swap (BADC):34 12 78 56(字节交换,也叫前小端)

对于两字节(16 位)数据,因为只有两个字节,它的排列组合只有两种可能:要么是 AB(大端),要么是 BA(小端)。 而到了四字节(32 位)数据,因为它跨了两个 Modbus 寄存器,情况就变得复杂了。这里其实包含了两个层面的“颠倒”:

Licensed under CC BY-NC-SA 4.0