1. UART通信基础:协议帧格式与波特率概念

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

理解UART协议的核心,需要掌握两个关键要素:帧格式(定义数据如何封装)和波特率(定义数据传输的速率)。下面逐一深入。

1.1 UART协议帧格式

UART是异步通信,收发双方没有独立的时钟线。为了正确解析数据,发送端必须按照约定的格式将数据“打包”成帧,接收端则按照同样的格式“拆包”。一个标准的UART数据帧由以下4个部分组成:

帧字段 位宽 电平状态 功能说明
起始位 1位 高→低跳变 标志数据帧开始,同步接收端采样时钟
数据位 5~9位(常用8位) LSB先发 承载实际传输的有效数据
校验位 0或1位 奇/偶/无 提供简单的错误检测能力
停止位 1/1.5/2位 高电平 标志帧结束,给接收端处理时间
关键理解:起始位的下降沿是接收端同步的“心跳信号”。接收端检测到该跳变后,按照约定的波特率在每个位时间的中间点采样,从而正确恢复数据。

下面通过一张SVG时序图直观展示UART帧的完整结构:

UART标准帧格式时序图(8N1配置) UART 标准帧格式时序图(8N1:8数据位 + 无校验 + 1停止位) 空闲 起始位 0 D0 LSB D1 D2 D3 D4 D5 D6 D7 MSB 停止位 1 1 位时间 1 帧 = 起始位(1) + 数据位(8) + 停止位(1) = 10 位时间 说明:8N1 配置下,每帧固定占用 10 个位时间。波特率决定每个位时间的物理时长。

1.2 帧格式的配置选项

实际工程中,帧格式并非固定不变。MCU的UART外设通常提供以下可配置参数:

  • 数据位长度:常用7位(ASCII字符集)或8位(字节数据)。部分UART支持9位(用于多机通信地址/数据标志)。
  • 校验位类型:
    • 无校验(N):不添加校验位,帧开销最小。
    • 奇校验(O):数据位 + 校验位中“1”的个数为奇数。
    • 偶校验(E):数据位 + 校验位中“1”的个数为偶数。
  • 停止位长度:1位最常用;1.5位用于某些特殊场景;2位用于慢速设备或需要更长处理时间的场景。
工程建议:MCU间通信最常用的配置是 8N1(8数据位、无校验、1停止位)。该配置兼容性最好,帧效率最高(每10位传输8位有效数据,利用率80%)。只有在电磁干扰较强的工业现场,才建议开启校验位。

1.3 波特率概念

波特率(Baud Rate)定义的是UART每秒传输的符号数。在UART中,每个符号对应一个位(bit),因此波特率 = 比特率(bit/s)。

波特率的本质是位时间的倒数:

位时间 (s) = 1 / 波特率 (bps)

示例:
波特率 9600 bps → 位时间 ≈ 104.17 μs
波特率 115200 bps → 位时间 ≈ 8.68 μs
波特率 921600 bps → 位时间 ≈ 1.085 μs

收发双方必须使用完全一致的波特率,否则接收端会在错误的时刻采样,导致数据错位(帧错误)。

1.4 常见波特率与误差容忍

下表列出MCU开发中最常用的标准波特率及其典型应用场景:

波特率 (bps) 位时间 典型应用场景 误差容忍度
2400 416.67 μs 低速传感器、老旧设备 ±3%
9600 104.17 μs 工业仪表、GPS模块、调试串口 ±2%
38400 26.04 μs 蓝牙模块、无线透传 ±1.5%
115200 8.68 μs MCU调试、Wi-Fi模块、高速传感器 ±1%
921600 1.085 μs 高速数据采集、内部核间通信 ±0.5%
避坑提醒:MCU的UART波特率由系统时钟分频得到,并非所有时钟频率都能精确产生标准波特率。例如,使用8MHz系统时钟时,产生115200波特率的理论分频系数为 8000000 / (16 × 115200) ≈ 4.34,取整后实际波特率为 8000000 / (16 × 4) = 125000 bps,误差高达8.5%,远超±1%的容忍范围,会导致通信失败。下一章将详细讲解如何通过寄存器配置精确计算波特率。

1.5 波特率与帧传输时间的关系

理解波特率后,可以计算传输一个完整数据帧所需的时间:

帧传输时间 = 帧总位数 × 位时间
            = 帧总位数 / 波特率

示例(8N1配置,115200 bps):
帧总位数 = 1(起始位)+ 8(数据位)+ 1(停止位)= 10 位
帧传输时间 = 10 / 115200 ≈ 86.8 μs
有效数据吞吐率 = 8 / 86.8 μs ≈ 92.2 KB/s

下面通过第二张SVG图展示波特率与位时间、帧时间之间的换算关系:

波特率与时间换算关系图 波特率与时间换算关系图 波特率 (bps) 位时间 = 1 / 波特率 单位:秒 (s) 帧时间 = 位时间 × 帧总位数 帧总位数 = 1 + 数据位 + 校验位 + 停止位 计算示例(8N1,115200 bps) 位时间 = 1 / 115200 ≈ 8.68 μs 帧总位数 = 1(起始)+ 8(数据)+ 1(停止)= 10 位 帧时间 = 10 × 8.68 μs ≈ 86.8 μs

1.6 本章小结

  • UART帧格式由起始位(1位,低电平)、数据位(5~9位,LSB先发)、校验位(0或1位,可选)、停止位(1/1.5/2位,高电平)组成。
  • 8N1(8数据位、无校验、1停止位)是MCU开发中最通用的配置,帧效率80%。
  • 波特率决定位时间,收发双方必须严格一致,误差需控制在±1%~±3%以内。
  • 帧传输时间 = 帧总位数 / 波特率,该公式是后续计算中断服务程序处理时间的基础。