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是异步协议,收发双方没有共享时钟。帧的同步完全依赖起始位的下降沿和双方约定的波特率。
UART标准帧结构(8N1格式) 起始位 0 D0 LSB D1 D2 D3 D4 D5 D6 D7 MSB 校验位 可选 停止位 1 一帧数据(10位,无校验) t₀ t₁

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%
常见UART帧格式对比(8N1 vs 8E1 vs 8N2) 8N1: S D0 D1 D2 D3 D4 D5 D6 D7 P (无) St = 10位 8E1: S D0 D1 D2 D3 D4 D5 D6 D7 P (偶) St = 11位 8N2: S D0 D1 D2 D3 D4 D5 D6 D7 P (无) St St = 11位 图例说明: S = 起始位 D0-D7 = 数据位 P = 校验位 St = 停止位 8N1效率最高,8E1/8N2增加可靠性

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%以内。