深入浅出 STM32 USART 串口:从基础概念到帧格式与波特率
在学习 STM32 的过程中,串口(USART/UART)几乎是每个开发者最先接触、也是最常用的通信外设。无论是打印调试信息,还是与外部传感器、蓝牙模块通信,都离不开它。
本文基于 STM32 串口知识,对帧格式及其之前的核心概念(物理层、通信方式、波特率等)进行系统性总结。带你一次性打通串口底层逻辑!
一、 什么是 UART
UART (Universal Asynchronous Receiver/Transmitter),即通用异步收发器。它是一种硬件电路,用于设备间的串行通信(数据按位顺序,一次发1位)。
1. 物理接线
UART 的接线非常简单,主要由两根数据线和一根地线构成:
- Tx(Transmit):发送数据线
- Rx(Receive):接收数据线
- GND(地线):提供公共地,确保电平基准一致
连线规则 :Tx 接对端 Rx,Rx 接对端 Tx(交叉互连),构建双向通信。
2. 通信双方的关系
通信双方地位对等,没有主从概念,共同遵守一套约定的规则即可完成通信。
二、 UART 的四大核心特点
要理解串口,我们需要先了解它所在的通信分类框架:
1. 串行通信 与 并行通信
-
并行:多根线同时传(如8根线传8位),速度快但成本高、易受串扰、抗干扰差(仅限板级)。
-

-
串行 :一根线按时间顺序一位一位传。UART 属于串行通信(注意:SPI、I2C、CAN 也是串行通信,串行 ≠ UART)。

2. 异步通信 与 同步通信
- 同步:有时钟线(SCK),双方踩着同一个节拍(时钟沿)收发数据。
* 异步 :没有时钟线 UART 正是异步通信,依靠双方事先约定好的波特率 (每个 bit 持续的时间)来识别数据。

3. 1对1通信
一个串口模块只能与另一个串口模块通信,不支持像 I2C 那样挂载多个设备。
4. 全双工通信
- 单工:只能单向传输(如广播)。
- 半双工:可以双向,但同一时刻只能有一方说话(如对讲机)。
- 全双工 :UART 拥有独立的 Tx 和 Rx 线,可以同时发送和接收 (像日常吵架,你说你的,我说我的)。注:基于 UART 的 RS-485 是半双工。
三、 MCU 与串口的关系
在 STM32 内部,串口是以片上外设的形式挂载在 APB 总线上的。
1. UART 与 USART 的区别
STM32 的参考手册中通常叫 USART (Universal Synchronous Asynchronous Receiver Transmitter),比 UART 多了一个 Synchronous(同步) 功能。
- 如果给 USART 额外提供一根时钟线(CLK),即可实现同步通信。
- 但实际应用中极少使用同步功能,因此忽略同步功能,USART == UART。
2. 四方关系:MCU、USART、GPIO 与 外部设备
USART 模块不直接对外,而是复用 GPIO 引脚(如 PA9 作 TX,PA10 作 RX)。MCU 内部的 USART 控制器将通过 GPIO 的高低电平向外输出信号。
四、 速度的灵魂:比特率 与 波特率
在宏观上,发送端输出高低电平表示 0 和 1,但接收端怎么知道发送端的速度有多快呢?这就引出了波特率。
1. 比特率(Bit Rate)
- 定义 :每秒传输的比特(bit)数,单位 bps(bits per second)。
- 侧重 :衡量传递有效信息的数据量。
2. 波特率(Baud Rate)
- 定义 :每秒传输的码元(Symbol)数量,单位 Baud。
- 侧重 :衡量信号跳变的速率。

3. 两者的关系
比特率 = 波特率 × 单个码元携带的比特数
对于单片机的 UART 来说,使用的是高低电平两种状态(二进制码元),每个码元只携带 1 比特信息。因此:在 UART 中,比特率 == 波特率。
4. 波特率的本质意义
波特率设置的越高,传输速度越快。但它底层的物理意义是:决定了单个信号电平持续的时间 。
例如波特率为 9600,意味着每个 bit 持续约 (1 / 9600) 秒。双方必须设置相同的波特率,才能正确采样。
五、 USART 帧格式
解决了"速度"问题,接下来要解决的是"边界"问题:接收方怎么知道数据什么时候开始?什么时候结束?数据有几位?
这就需要双方约定好数据帧格式 。

1. 一帧数据的组成
UART 的一帧(Frame)数据通常由以下部分构成(按发送顺序):
- 空闲状态(Idle):总线保持逻辑高电平(1)。
- 起始位(Start Bit) :拉低电平(0),持续 1 个位时间。这是关键!下降沿告诉接收方:"我要开始发数据了,请同步节拍!"
- 数据位(Data Bits) :通常是 8 位或 9 位。低位(LSB)在前,高位(MSB)在后。
- 校验位(Parity Bit) (可选):用于简单的错误检测(奇校验/偶校验)。
- 奇校验:数据位+校验位中,1 的个数为奇数。
- 偶校验:数据位+校验位中,1 的个数为偶数。
- 注意:校验只能检测奇数个错误,无法纠错。
- 停止位(Stop Bit) :拉高电平(1),持续 1、1.5 或 2 个位时间。告诉接收方本帧结束。
- 回到空闲状态。
2. 为什么必须要结束位?
如果当前帧发完不强制拉高(停止位),那么下一个起始位的拉低动作可能就不存在(因为前面正好是低电平),会导致下一帧无法正确开始。停止位保证了每一帧起始位到来前,总线一定有确定的高电平。
3. 常见疑问解答
- Q:会不会把起始位当成数据位?
- A:不可能。双方提前约定了帧格式(比如1起始+8数据+1停止),接收方识别到第一个下降沿就固定判定为起始位,不会错乱。
- Q:发 5 个字节,会有几个停止位?
- A :5 个。每次发送一个字节,都会形成一帧完整的数据(独立拥有起始位、数据位、停止位),就像每说一句话都要画一个句号一样。
六、 换算:波特率与传输速率
有了波特率和帧格式,我们就可以算理论上的传输速度了。
【示例 1】常规配置
- 波特率:
9600 Bd(bps) - 帧格式:
1起始位 + 8数据位 + 无校验 + 1停止位 = 10 位 - 每秒传输字节数 =
9600 / 10 = 960 字节/秒
【示例 2】高速配置
- 波特率:
115200 Bd(bps) - 帧格式:
1起始位 + 8数据位 + 无校验 + 1停止位 = 10 位 - 每秒传输字节数 =
115200 / 10 = 11520 字节/秒
总结
- 交叉接线:Tx 连 Rx,共地。
- 异步全双工:没有时钟线,靠波特率同步;收发独立。
- 波特率:本质是电平持续时间,通信双方必须一致。
- 帧格式 :是双方约定好的语言规则,
起始位(低) + 数据位(LSB先发) + 校验位(可选) + 停止位(高),保证了数据的确定性。