MSB 先发的串行数据收发知识点整理
在嵌入式通信或低级协议设计中,数据通常需要按照位(bit)进行串行传输。其中 “MSB 先发”(Most Significant Bit First) 是常见的数据传输方式,即 最高位(MSB)最先发送,最低位(LSB)最后发送。
1. MSB 先发串行通信的基本概念
在串行通信中,数据是 按位(bit)依次发送的。
- MSB 先发(Most Significant Bit First):最高位最先传输,最低位最后传输。
- LSB 先发(Least Significant Bit First):最低位最先传输,最高位最后传输。
MSB 先发的传输方式
假设数据 0xA5
(十六进制)即 1010 0101
(二进制):
发送顺序(MSB 先发):
1 0 1 0 0 1 0 1 (最高位 → 最低位)
LSB 先发的传输方式
发送顺序(LSB 先发):
1 0 1 0 0 1 0 1 (最低位 → 最高位)
本文只讨论 MSB 先发 的情况。
2. MSB 先发的串行数据发送代码
目标:按位输出 8-bit 数据,每次发送 1 位
#include <stdio.h>/* * 串行数据发送(高位先发,MSB First)* 目标:按位输出 8-bit 数据,每次发送 1 位*/void sendData(unsigned char data) {printf("发送数据: 0x%X\n", data);// 逐位发送数据,从最高位(MSB)到最低位(LSB)for (int i = 7; i >= 0; i--) {unsigned char bit = (data >> i) & 0x01; // 取出最高位printf("%d", bit); // 输出当前位}printf("\n");
}int main() {unsigned char data = 0xA5; // 8-bit 数据 (1010 0101)sendData(data);return 0;
}
3. 代码解析
-
sendData(unsigned char data)
- 传入 8-bit 数据
data
,并将其按位发送。
- 传入 8-bit 数据
-
逐位提取和发送
- 使用
for (int i = 7; i >= 0; i--)
,确保从 最高位(MSB) 依次处理到 最低位(LSB)。 bit = (data >> i) & 0x01;
通过 右移i
位 并与0x01
按位与,获取data
的第i
位。printf("%d", bit);
模拟数据线上传输0
或1
。
- 使用
4. MSB 先发的串行数据接收代码
目标:模拟从串行输入接收 8-bit 数据,并存储到变量中
#include <stdio.h>/* * 串行数据接收(高位先收,MSB First)* 目标:模拟从串行输入接收 8-bit 数据,并存储*/unsigned char receiveData(unsigned char data) {unsigned char received = 0; // 存储接收的数据printf("接收数据: 0x%X\n", data);// 逐位接收数据,从最高位(MSB)到最低位(LSB)for (int i = 7; i >= 0; i--) {received = (received << 1) | ((data >> i) & 0x01); // 左移并存入新位}return received;
}int main() {unsigned char data = 0xA5; // 8-bit 数据 (1010 0101)unsigned char received = receiveData(data);printf("重构后的数据: 0x%X\n", received);return 0;
}
5. 代码解析
-
receiveData(unsigned char data)
- 传入 模拟接收的 8-bit 数据
data
,然后进行 按位接收 处理。
- 传入 模拟接收的 8-bit 数据
-
逐位提取和存储
for (int i = 7; i >= 0; i--)
确保从 最高位 依次处理到 最低位。received = (received << 1) | ((data >> i) & 0x01);
- 先左移
received
1 位,为新位腾出空间。 - 提取
data
的第i
位,并存入received
变量。
- 先左移
6. 代码输出
如果运行这两段代码,会得到:
发送数据: 0xA5
10100101接收数据: 0xA5
重构后的数据: 0xA5
说明数据正确地 按位发送并接收,且 数据完整性保持不变。
7. 关键知识点总结
MSB 先发的串行数据发送
- 数据按位逐次发送,最高位(MSB)先发。
- 右移
i
位 &0x01
提取当前位,再输出。 - 可以通过时钟信号触发传输(在实际硬件上)。
MSB 先发的串行数据接收
- 数据按位逐次接收,最高位(MSB)先收。
- 左移
received
1 位,再存入新位,确保数据位置正确。 - 最终数据应与原始
data
相同,保证正确传输。
MSB 先发 与 LSB 先发
- MSB 先发:最高位先发送,适用于 SPI、I²C、RS232 等多种协议。
- LSB 先发:最低位先发送,部分 UART、某些专用协议可能采用。
8. 适用场景
- 嵌入式系统(单片机、ARM)
- 低级硬件通信(I²C、SPI、UART)
- 数字信号处理(DSP)
- 软件模拟串行通信(Bit-Banging)
(完)