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帧的完整结构:
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图展示波特率与位时间、帧时间之间的换算关系:
1.6 本章小结
- UART帧格式由起始位(1位,低电平)、数据位(5~9位,LSB先发)、校验位(0或1位,可选)、停止位(1/1.5/2位,高电平)组成。
- 8N1(8数据位、无校验、1停止位)是MCU开发中最通用的配置,帧效率80%。
- 波特率决定位时间,收发双方必须严格一致,误差需控制在±1%~±3%以内。
- 帧传输时间 = 帧总位数 / 波特率,该公式是后续计算中断服务程序处理时间的基础。