1. UART 基础概念
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是嵌入式系统中最基础、最常用的串行通信接口之一。它通过两根信号线(TX 和 RX)实现设备间的全双工数据交换,无需共享时钟信号,因此被称为“异步”通信。理解 UART 的协议原理、帧格式和波特率配置,是后续驱动开发(轮询→中断→DMA)的基石。
1.1 串行通信原理
串行通信与并行通信的核心区别在于:串行通信逐位发送数据,而并行通信同时发送多位。UART 属于串行通信,其物理层仅需两条数据线(TX 发送、RX 接收)和一条公共地线(GND)。
关键特性: 异步、全双工、点对点、无时钟线。
| 通信方式 | 数据线数量 | 时钟同步 | 传输距离 | 典型应用 |
|---|---|---|---|---|
| UART(异步串行) | 2(TX + RX) | 无(需双方约定波特率) | 中(1~15m) | 调试串口、传感器、GPS 模块 |
| SPI(同步串行) | 4(SCLK + MOSI + MISO + CS) | 有(主设备提供时钟) | 短(板级) | Flash、ADC、显示屏 |
| I²C(同步串行) | 2(SCL + SDA) | 有(主设备提供时钟) | 短(板级) | EEPROM、传感器、RTC |
| 并行通信 | ≥8(数据线 + 控制线) | 有 | 极短(板级) | 旧式打印机、并口存储器 |
UART 的异步特性意味着发送方和接收方必须预先约定相同的波特率,才能正确采样每一位数据。接收端通过检测起始位的下降沿来同步位采样时钟。
1.2 UART 数据帧格式
UART 协议以“帧”为单位传输数据。一个标准的数据帧由以下部分组成:
- 起始位(Start Bit): 逻辑低电平(0),标志一帧的开始,用于接收端同步位采样时钟。
- 数据位(Data Bits): 通常为 5~9 位,常见配置为 8 位。低位(LSB)先发送。
- 校验位(Parity Bit): 可选,用于简单的错误检测。支持无校验(None)、奇校验(Odd)、偶校验(Even)、强制 0/1(Mark/Space)。
- 停止位(Stop Bit): 逻辑高电平(1),标志一帧结束。常见配置为 1 位、1.5 位或 2 位。
| 字段 | 位宽 | 电平 | 说明 |
|---|---|---|---|
| 起始位 | 1 bit | 低(0) | 帧同步信号,下降沿触发接收采样 |
| 数据位 | 5~9 bits | LSB 先发 | 实际传输的有效数据,常用 8 位 |
| 校验位 | 0 或 1 bit | 取决于校验方式 | 奇偶校验:使 1 的个数为奇数/偶数 |
| 停止位 | 1 / 1.5 / 2 bits | 高(1) | 帧结束标志,保证帧间有恢复时间 |
常见配置: 8N1(8 数据位、无校验、1 停止位)是嵌入式开发中最通用的 UART 帧格式,也是 Linux 串口驱动的默认配置。
1.3 波特率
波特率(Baud Rate)定义每秒传输的符号数。在 UART 中,一个符号对应一个 bit,因此波特率等于比特率(bps)。常见波特率包括:
- 9600 bps: 最经典的标准,广泛用于调试终端、老旧设备。
- 115200 bps: 嵌入式开发中最常用的高速串口波特率,兼顾速度与稳定性。
- 921600 bps / 1 Mbps: 用于高速数据传输,如固件升级、日志输出。
波特率决定了每一位的持续时间:
位时间 (s) = 1 / 波特率
示例:波特率 115200 bps
位时间 = 1 / 115200 ≈ 8.68 μs
一帧(8N1)总时间 = 10 bits × 8.68 μs ≈ 86.8 μs
理论最大吞吐 ≈ 11520 字节/秒
常见误区: 波特率越高,传输距离越短,对时钟精度要求越高。在长线传输或噪声环境中,应适当降低波特率。
1.4 硬件信号与连接
标准 UART 接口至少包含以下信号:
| 信号 | 方向 | 说明 |
|---|---|---|
| TX | 输出 | 发送数据线 |
| RX | 输入 | 接收数据线 |
| GND | 公共地 | 信号参考地,必须连接 |
| RTS / CTS | 输出 / 输入 | 硬件流控(可选),用于防止数据溢出 |
连接时需注意交叉连接:设备 A 的 TX 接设备 B 的 RX,设备 A 的 RX 接设备 B 的 TX。GND 必须相连,否则信号无法形成回路。
1.5 流控机制
UART 提供两种流控方式,用于防止接收端数据溢出:
- 硬件流控(RTS/CTS): 通过专用信号线实现。接收端准备就绪时置高 RTS,发送端检测 CTS 为高时才发送数据。
- 软件流控(XON/XOFF): 通过发送特殊字符(0x11 XON、0x13 XOFF)控制数据流,无需额外引脚,但仅适用于文本传输。
驱动开发提示: 在 Linux 内核中,UART 驱动通过
termios 结构体配置波特率、帧格式和流控模式。后续章节将深入讲解如何操作 UART 控制器寄存器。
1.6 本章小结
UART 作为异步串行通信协议,其核心要素包括:
- 串行逐位传输,仅需 TX、RX、GND 三线即可实现全双工通信。
- 数据帧由起始位、数据位(LSB 先发)、可选校验位和停止位组成。
- 波特率决定位传输速率,收发双方必须一致。
- 硬件/软件流控可选,用于协调数据收发节奏。