Skip to content

有效载荷?低位先行?

这两个概念分别解决了通信中的两个核心问题:

  1. 有效载荷:我们到底在传什么?(内容 vs 包装)
  2. 低位先行:我们该怎么传?(顺序问题)

1. 有效载荷 (Payload)

定义: 去掉所有的“包装”后,你真正想要传输的 核心数据

📦 生活比喻:网购快递

想象你在网上买了一部手机:

  • 快递员送来一个纸箱子,上面贴着 快递单,里面塞满了 防震泡沫,最中间才是 手机
  • 对于你(用户)来说: 那个手机就是 “有效载荷” (Payload)“
  • 对于快递公司(通信协议)来说: 纸箱、快递单、泡沫都是 “协议开销” (Overhead)“。它们是为了保证手机能安全、准确送到而必须存在的,但不是你想要的。

💻 技术视角:数据包结构

在单片机通信(比如 UART 串口)中,发送一个字节(比如字母 'A')通常需要 10 个位的时间:

结构Start Bit (起始位)Data (数据位)Parity (校验位)Stop Bit (停止位)
内容00100 0001 ('A')(可选)1
角色包装 (告诉接收方开始)有效载荷 (Payload)包装 (检查错误)包装 (告诉接收方结束)
  • 有效载荷效率: 这里发了 10~11 个位,但只有 8 个位是“干货”(Payload)。

2. 低位先行 (Low Bit First / LSB First)

定义: 在串行通信中,把一个字节(8 bit)拆开发送时,先发送“权重最小”的那一位(最低位),最后发送“权重最大”的那一位(最高位)。

🔢 先搞懂:谁是低位 (LSB)?

拿十进制举例:数字 123

  • 3 是个位(权重最小),它就是 LSB (Least Significant Bit)
  • 1 是百位(权重最大),它就是 MSB (Most Significant Bit)

拿二进制举例:数字 0x01 (也就是二进制 0000 0001)。

  • 最右边的 1低位 (LSB)
  • 最左边的 0高位 (MSB)

🔄 两种发送顺序的对比

假设我们要发送 0x9D (二进制 1001 1101):

  1. 低位先行 (LSB First) —— [UART 串口常用]
    • 发送顺序:1 (LSB) -> 0 -> 1 -> 1 -> 1 -> 0 -> 0 -> 1 (MSB)
    • 口诀:倒着发。
  2. 高位先行 (MSB First) —— [I2C, SPI 常用]
    • 发送顺序:1 (MSB) -> 0 -> 0 -> 1 -> 1 -> 1 -> 0 -> 1 (LSB)
    • 口诀:正着发(符合人类阅读习惯)。

⚠️ 为什么要区分这个?

这就好比两个人约好念电话号码。

  • 你要传 123
  • 如果你按“低位先行”念:“3... 2... 1”。
  • 如果对方按“高位先行”去听,他记下来的就是 321
  • 结果:123 变成了 321,数据完全错了!

这就是为什么在配置 SPI 时,必须设置 SPI_FirstBit_LSBSPI_FirstBit_MSB,要确保收发双方的标准一致。

总结

  • 有效载荷: 剔除掉起始位、停止位、地址头之后,那块真正的肉
  • 低位先行: 比如发一串二进制,先发个位,再发十位、百位...(主要是 UART 在用)。

注意

在做 STM32 的 UART 通信时,默认就是 LSB First(硬件定死的,不用管)。 但在用 SPI 驱动屏幕或芯片时,一定要看那个芯片的数据手册(Datasheet),如果它要求 MSB First 而你设成了 LSB First,屏幕就会显示花屏或者命令不响应。