1. UART协议基础:帧结构详解
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是嵌入式系统中最基础、最广泛使用的串行通信协议之一。理解其帧结构是驱动开发和调试的基石。本章将逐位拆解UART帧,并深入分析各字段的作用与设计考量。
1.1 UART帧结构总览
一个标准的UART帧由以下字段按顺序组成:
- 起始位(Start Bit):1位,逻辑低电平(0),标志数据传输开始。
- 数据位(Data Bits):5~9位,通常为8位,低位在前(LSB first)。
- 校验位(Parity Bit):0或1位,用于简单的错误检测。
- 停止位(Stop Bit):1、1.5或2位,逻辑高电平(1),标志帧结束。
关键概念: UART是异步协议,收发双方没有共享时钟。帧的同步完全依赖起始位的下降沿和双方约定的波特率。
1.2 起始位(Start Bit)
起始位是UART帧的同步信号。在空闲状态(Idle)下,TX线保持逻辑高电平(1)。当发送器准备发送数据时,将TX线拉低(0)并保持一个位时间,即起始位。
- 作用:通知接收器“数据即将到来”,并提供位同步的参考边沿。
- 电平:逻辑0(低电平),与空闲状态(逻辑1)形成明确跳变。
- 持续时间:恰好1个波特率位时间(T_bit = 1 / BaudRate)。
调试提示: 示波器测量UART信号时,首先寻找从高到低的下降沿。起始位的下降沿是触发捕获的理想位置。如果起始位宽度异常(短于或长于1个位时间),说明波特率配置可能不匹配。
1.3 数据位(Data Bits)
数据位承载实际传输的信息。常见的配置为8位数据位(8N1格式),但协议支持5~9位。
| 数据位长度 | 典型应用场景 | 说明 |
|---|---|---|
| 5位 | 老式电传打字机、某些工业仪表 | 仅传输0~31的字符集 |
| 6位 | 某些ASCII子集通信 | 较少使用 |
| 7位 | 纯ASCII文本通信(0~127) | 常用于早期Modbus、短信协议 |
| 8位 | 最通用,二进制数据、标准ASCII | 嵌入式系统默认配置 |
| 9位 | 多机通信地址/数据标志 | 如RS-485多机协议中的第9位寻址 |
传输顺序:数据位总是低位在前(LSB First)。例如发送字节 0x55(二进制 01010101),在TX线上出现的顺序为:1 → 0 → 1 → 0 → 1 → 0 → 1 → 0(D0到D7)。
常见误区: 初学者常误以为数据位从高位开始传输。实际上UART协议规定LSB first,这与SPI、I²C等协议不同。调试时如果发现数据字节被反转(如0x01变成0x80),请检查数据位顺序配置。
1.4 校验位(Parity Bit)
校验位提供简单的错误检测机制。发送器根据数据位中1的个数,自动计算并插入校验位;接收器重新计算并比对。
| 校验模式 | 校验位值 | 检测能力 | 典型应用 |
|---|---|---|---|
| 无校验(None) | 无校验位 | 无 | 大多数嵌入式场景(8N1) |
| 奇校验(Odd) | 使数据位+校验位中1的总数为奇数 | 检测单比特错误 | 噪声环境下的简单检错 |
| 偶校验(Even) | 使数据位+校验位中1的总数为偶数 | 检测单比特错误 | Modbus RTU、某些工业协议 |
| 强制1(Mark) | 校验位恒为1 | 无 | 极少使用,兼容旧设备 |
| 强制0(Space) | 校验位恒为0 | 无 | 极少使用 |
注意: 校验位只能检测奇数个比特错误。如果传输过程中有2个比特同时翻转(偶数个错误),校验位无法发现。对于高可靠性要求,应使用更高级的CRC校验或协议层重传机制。
1.5 停止位(Stop Bit)
停止位标志一帧数据的结束,并给接收器留出处理时间。停止位必须为逻辑高电平(1)。
- 1位停止位:最常用,帧效率最高(10位/帧,8N1)。
- 1.5位停止位:某些老式UART或特殊应用,实际为1.5个位时间的高电平。
- 2位停止位:给接收器更长的处理窗口,常用于低速设备或高延迟链路。
帧效率计算:以8N1(8数据位、无校验、1停止位)为例:
帧总位数 = 1(起始) + 8(数据) + 0(校验) + 1(停止) = 10位
有效数据率 = 8 / 10 = 80%
波特率115200时,实际有效数据速率 = 115200 × 0.8 = 92160 bps
1.6 常见帧格式对比
| 格式名称 | 起始位 | 数据位 | 校验位 | 停止位 | 总位数 | 效率 |
|---|---|---|---|---|---|---|
| 8N1 | 1 | 8 | 无 | 1 | 10 | 80% |
| 8E1 | 1 | 8 | 偶校验 | 1 | 11 | 72.7% |
| 8O1 | 1 | 8 | 奇校验 | 1 | 11 | 72.7% |
| 7E1 | 1 | 7 | 偶校验 | 1 | 10 | 70% |
| 8N2 | 1 | 8 | 无 | 2 | 11 | 72.7% |
| 9N1 | 1 | 9 | 无 | 1 | 11 | 81.8% |
1.7 波特率与位时间
波特率(Baud Rate)定义每秒传输的符号数。在UART中,1个符号=1位,因此波特率等于比特率(bps)。
位时间 T_bit = 1 / 波特率
示例:
波特率 9600 → T_bit ≈ 104.17 μs
波特率 115200 → T_bit ≈ 8.68 μs
波特率 921600 → T_bit ≈ 1.085 μs
调试要点: 波特率误差是UART通信失败的常见原因。收发双方的波特率误差必须在±2%以内(通常要求±1.5%)。误差来源包括:晶振精度、时钟分频器整数限制、PLL抖动等。本课程后续章节将详细讲解波特率误差的测量与校准方法。
1.8 本章小结
- UART帧由起始位(1位低电平)、数据位(5~9位,LSB first)、可选的校验位和停止位(1/1.5/2位高电平)组成。
- 8N1(8数据位、无校验、1停止位)是嵌入式系统最通用的配置,帧效率80%。
- 起始位的下降沿是接收器同步的关键;停止位必须为高电平,否则产生帧错误(Framing Error)。
- 校验位只能检测奇数个比特错误,不能替代CRC等强校验。
- 波特率误差是调试中的核心问题,收发双方误差需控制在±2%以内。