串口通信
文章讲解串口UART如何以二进制帧传输数据,包括起始位、数据位、校验位、停止位的帧结构,波特率异步同步原理,以及奇偶校验仅能发现奇数位翻转的局限。
一、机器的语言:0 和 1
计算机和嵌入式设备的底层电路,本质上只认识两种状态:高电平(1)和低电平(0)。它们不会说人话,也不会直接传递 “Hello” 或温度数值 25.6。所以,任何信息——文字、数字、指令——都必须先转换成二进制编码,才能在线缆上”跑”起来。
串口通讯(UART)就是最早、最基础的一种二进制传输方式。
二、一帧数据的结构
串口发送数据时,不是直接把二进制码流怼过去,而是按固定格式打包成一帧。一帧通常包含以下几个部分:
表格
| 部分 | 作用 |
|---|---|
| 起始位 | 固定为低电平(0),告诉接收端”我要开始发数据了” |
| 数据位 | 5~9 位,存放真正的信息(如 ASCII 码 01000001) |
| 校验位(可选) | 用于简单检错 |
| 停止位 | 固定为高电平(1),标记一帧结束,提供帧间间隔 |
发送顺序:起始位 → 数据位(低位在前)→ 校验位 → 停止位。
plain
波形示意(发送字母 'A',ASCII 0x41 = 0100 0001):
1 0 1 0 0 0 0 0 1 1 ↑ └─数据位(LSB first)────────┘ ↑停止位 校验位(偶校验) ↑ 起始位(低电平0)三、波特率:解决”什么时候读”的问题
如果线路上一直传来 0 或 1,接收端怎么知道”这是第几帧的第几位”?
答案是:双方先约定好速度。
波特率(Baud Rate) 表示每秒钟传输的码元数。对于最简单的二进制串口,1 波特 = 1 比特/秒。常见的有 9600、115200 等。
它的真正作用不是”单位时间内识别一帧”,而是约定每比特电平的持续时间。例如 9600 波特率下,每比特约 104 微秒。
接收端检测到起始位的下降沿(从高变低)后,会等待 1.5 个位时长,然后每隔一个位时长采样一次。这样,即使收发双方的时钟略有偏差,也能在短帧内保持同步。
💡 正因为靠起始位重新对齐时钟,UART 被称为异步通讯——不需要额外的时钟线。
四、校验位:给数据加个”安检”
现实环境中,线缆可能受到电磁干扰,某个 0 可能变成 1,或者反过来。校验位就是用来简单排查这种错误的。 
偶校验(Even Parity)
-
统计数据位中
1的个数。 -
如果是偶数,校验位填
0;如果是奇数,校验位填1。 -
最终整帧(数据位 + 校验位)中
1的总数为偶数。
奇校验(Odd Parity)
-
统计数据位中
1的个数。 -
如果是奇数,校验位填
0;如果是偶数,校验位填1。 -
最终整帧中
1的总数为奇数。 加上GND就从半双工变成全双工了
接收端收到一帧后,也按同样的规则数一遍。如果对不上,就知道这帧大概率被干扰了,可以选择丢弃或请求重发。
⚠️ 校验位只能检测奇数个位翻转的错误。如果恰好有 2 位同时翻转,它就”看”不出来了。所以重要场合往往还要配合上层校验(如 CRC)。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
评论区
正在加载 GitHub 评论…