1. UART 通信基础

UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是 MCU 开发中最基础、使用最广泛的串行通信协议之一。它只需要两根信号线(TX 发送、RX 接收)即可实现全双工通信,硬件开销极低,几乎每款 MCU 都内置了至少一个 UART 外设模块。

理解 UART 协议帧格式、各数据位的含义以及波特率的概念,是后续配置中断模式、调优通信参数的前提。本节将从物理层到数据链路层,逐层拆解 UART 通信的核心要素。

1.1 UART 协议帧格式

UART 是异步通信协议,收发双方没有独立的时钟线,而是通过约定的波特率(位传输速率)和帧格式来同步数据。一个完整的 UART 数据帧由以下四个部分组成:

帧字段 位宽 电平状态 功能说明
起始位 1 位 逻辑 0(低电平) 标志数据帧开始,同步接收器时钟
数据位 5~9 位(常用 8 位) LSB 先发送 承载实际传输的有效数据
校验位 0 或 1 位 奇/偶/固定电平 可选,用于检错
停止位 1、1.5 或 2 位 逻辑 1(高电平) 标志帧结束,提供帧间隔
关键理解:UART 帧的起始位和停止位是异步通信的“握手信号”。起始位的下降沿(从高电平跳变到低电平)是接收器检测数据帧开始的唯一同步事件,停止位的高电平则保证总线在空闲时处于确定状态。
UART 协议帧格式时序图 UART 协议帧格式时序图(8N1 配置) 空闲(高电平) 起始位 逻辑 0 D0 LSB D1 D2 D3 D4 D5 D6 D7 MSB 停止位 逻辑 1 帧间隔 说明:8N1 配置 = 8 位数据位 + 无校验 + 1 位停止位 数据位从 LSB(最低有效位)开始发送,MSB(最高有效位)最后发送

1.2 起始位 / 数据位 / 校验位 / 停止位详解

1.2.1 起始位(Start Bit)

  • 电平特征:从空闲的高电平(逻辑 1)跳变为低电平(逻辑 0),持续一个位时间。
  • 作用:提供帧同步信号。接收器检测到下降沿后,启动内部波特率采样时钟,开始接收后续数据位。
  • 注意事项:起始位的下降沿必须干净、无抖动,否则会导致接收器采样偏移,产生帧错误。

1.2.2 数据位(Data Bits)

  • 位宽配置:通常为 5、6、7、8 或 9 位。MCU 应用中最常用的是 8 位数据位(对应一个字节)。
  • 发送顺序:LSB(最低有效位)先发送,MSB(最高有效位)最后发送。这是 UART 协议的标准约定,与 I²C 或 SPI 的 MSB-first 不同。
  • 典型配置:8 位数据位 + 无校验(8N1)是最常见的组合,兼容 ASCII 码和二进制数据。

1.2.3 校验位(Parity Bit)

校验位是可选的检错机制,用于检测数据位在传输过程中是否发生单比特翻转。校验方式分为三种:

校验模式 校验位电平 检错能力 适用场景
无校验(None) 无校验位 无 短距离、低噪声环境,追求吞吐量
奇校验(Odd) 使数据位 + 校验位中 1 的个数为奇数 检测单比特错误 工业现场、对可靠性有基本要求的场景
偶校验(Even) 使数据位 + 校验位中 1 的个数为偶数 检测单比特错误 与奇校验对称,常用于 Modbus 等协议
实战建议:在中断模式 UART 驱动中,如果使能了校验位,接收中断服务函数(ISR)中必须检查校验错误标志位(如 USART_SR 中的 PE 位)。一旦发现校验错误,应丢弃当前数据帧并重新同步,避免错误数据进入应用层。

1.2.4 停止位(Stop Bit)

  • 电平特征:高电平(逻辑 1),持续 1、1.5 或 2 个位时间。
  • 作用:标志一帧数据结束,并为下一帧的起始位下降沿提供准备时间。
  • 位宽选择:
    • 1 位停止位:最常用,帧开销最小,适用于大多数场景。
    • 1.5 位停止位:仅用于某些老式 UART 或特殊协议。
    • 2 位停止位:增加帧间隔,适用于高噪声环境或低速通信,给接收器更多处理时间。

1.3 波特率概念

波特率(Baud Rate) 定义为单位时间内传输的符号(码元)数量,单位是 baud(波特)。在 UART 通信中,一个符号对应一个比特位,因此波特率等于比特率(bit/s)。

波特率决定了每一位的持续时间:

位时间 (T_bit) = 1 / 波特率

示例:
波特率 = 115200 baud
位时间 = 1 / 115200 ≈ 8.68 μs

收发双方必须使用相同的波特率,且波特率误差必须控制在允许范围内(通常要求 < 2%),否则会导致采样错位,产生帧错误或数据乱码。

波特率(baud) 位时间 传输 1 字节耗时(8N1) 典型应用
9600 104.17 μs ≈ 1.04 ms 调试串口、GPS 模块、低速传感器
38400 26.04 μs ≈ 260 μs 工业控制、Modbus RTU
115200 8.68 μs ≈ 86.8 μs MCU 调试日志、蓝牙模块、Wi-Fi 模块
921600 1.09 μs ≈ 10.9 μs 高速数据采集、固件升级
波特率误差陷阱:MCU 的 UART 波特率由系统时钟分频产生。如果系统时钟频率不是波特率的整数倍,会产生分频误差。例如,使用 16 MHz 系统时钟产生 115200 波特率时,分频系数 = 16 MHz / (16 × 115200) ≈ 8.68,取整后实际波特率 = 16 MHz / (16 × 8) = 125000,误差高达 8.5%,会导致通信失败。必须使用支持小数分频的 UART 或调整系统时钟频率。
波特率误差对采样点的影响 波特率误差对接收采样点的影响 理想接收(误差 0%) 采样点 位中心 误差接收(+3% 偏移) 采样点 偏移 误差累积:每帧 10 位(起始+8数据+停止),3% 误差导致最后一位偏移约 2.4 个采样点

1.4 常见 UART 配置组合速查表

配置名称 数据位 校验位 停止位 帧总位数 典型波特率
8N1 8 无 1 10 115200
8E1 8 偶校验 1 11 9600 / 19200
8O1 8 奇校验 1 11 38400
7E1 7 偶校验 1 10 9600(ASCII 协议)
8N2 8 无 2 11 4800 / 9600(高噪声环境)
课程要点回顾:
  1. UART 帧 = 起始位(1 位低电平)+ 数据位(5~9 位,LSB 先发)+ 可选校验位 + 停止位(1/1.5/2 位高电平)。
  2. 起始位的下降沿是接收器的同步触发信号,停止位的高电平保证总线空闲状态。
  3. 波特率决定位时间,收发双方波特率误差必须 < 2%,否则会产生采样偏移导致通信失败。
  4. 8N1(8 数据位、无校验、1 停止位)是最通用、兼容性最好的配置,也是本课程后续中断模式驱动开发的基础配置。