· 串口通信

串口通信

848 字
4 分钟
串口通信
StarryLin/Geek · 摘要

文章讲解串口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,或者反过来。校验位就是用来简单排查这种错误的。 ![Pasted image 20260831191601.png](./img/Pasted image 20260831191601.png)

偶校验(Even Parity)#

  • 统计数据位中 1 的个数。

  • 如果是偶数,校验位填 0;如果是奇数,校验位填 1。

  • 最终整帧(数据位 + 校验位)中 1 的总数为偶数。

奇校验(Odd Parity)#

  • 统计数据位中 1 的个数。

  • 如果是奇数,校验位填 0;如果是偶数,校验位填 1。

  • 最终整帧中 1 的总数为奇数。 ![Pasted image 20260831192208.png](./img/Pasted image 20260831192208.png)

    加上GND就从半双工变成全双工了

接收端收到一帧后,也按同样的规则数一遍。如果对不上,就知道这帧大概率被干扰了,可以选择丢弃或请求重发。

⚠️ 校验位只能检测奇数个位翻转的错误。如果恰好有 2 位同时翻转,它就”看”不出来了。所以重要场合往往还要配合上层校验(如 CRC)。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

串口通信
https://mjzy.tech/posts/通信协议/02-串口通信/
作者
JIA
发布于
2026-08-21
许可协议
CC BY-NC-SA 4.0

评论区

正在加载 GitHub 评论…

Tips · 随手记
仅自己可见 · 每篇文章单独保存

文章目录