有效载荷?低位先行?
这两个概念分别解决了通信中的两个核心问题:
- 有效载荷:我们到底在传什么?(内容 vs 包装)
- 低位先行:我们该怎么传?(顺序问题)
1. 有效载荷 (Payload)
定义: 去掉所有的“包装”后,你真正想要传输的 核心数据。
📦 生活比喻:网购快递
想象你在网上买了一部手机:
- 快递员送来一个纸箱子,上面贴着 快递单,里面塞满了 防震泡沫,最中间才是 手机。
- 对于你(用户)来说: 那个手机就是 “有效载荷” (Payload)“。
- 对于快递公司(通信协议)来说: 纸箱、快递单、泡沫都是 “协议开销” (Overhead)“。它们是为了保证手机能安全、准确送到而必须存在的,但不是你想要的。
💻 技术视角:数据包结构
在单片机通信(比如 UART 串口)中,发送一个字节(比如字母 'A')通常需要 10 个位的时间:
| 结构 | Start Bit (起始位) | Data (数据位) | Parity (校验位) | Stop Bit (停止位) |
|---|---|---|---|---|
| 内容 | 0 | 0100 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):
- 低位先行 (LSB First) —— [UART 串口常用]
- 发送顺序:1 (LSB) -> 0 -> 1 -> 1 -> 1 -> 0 -> 0 -> 1 (MSB)
- 口诀:倒着发。
- 高位先行 (MSB First) —— [I2C, SPI 常用]
- 发送顺序:1 (MSB) -> 0 -> 0 -> 1 -> 1 -> 1 -> 0 -> 1 (LSB)
- 口诀:正着发(符合人类阅读习惯)。
⚠️ 为什么要区分这个?
这就好比两个人约好念电话号码。
- 你要传
123。 - 如果你按“低位先行”念:“3... 2... 1”。
- 如果对方按“高位先行”去听,他记下来的就是
321。 - 结果:
123变成了321,数据完全错了!
这就是为什么在配置 SPI 时,必须设置 SPI_FirstBit_LSB 或 SPI_FirstBit_MSB,要确保收发双方的标准一致。
总结
- 有效载荷: 剔除掉起始位、停止位、地址头之后,那块真正的肉。
- 低位先行: 比如发一串二进制,先发个位,再发十位、百位...(主要是 UART 在用)。
注意
在做 STM32 的 UART 通信时,默认就是 LSB First(硬件定死的,不用管)。 但在用 SPI 驱动屏幕或芯片时,一定要看那个芯片的数据手册(Datasheet),如果它要求 MSB First 而你设成了 LSB First,屏幕就会显示花屏或者命令不响应。