1. UART 基础概念:通信原理与参数详解
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是嵌入式系统中最基础、最常用的串行通信接口。在 Android 驱动开发中,UART 承担着 内核调试信息输出、蓝牙/ GPS / 传感器通信 以及 AT 指令交互 等关键角色。理解 UART 的底层原理,是掌握 Android 驱动调试的第一步。
1.1 UART 通信原理
UART 通信使用两条主要数据线:TXD(发送) 和 RXD(接收),以及一条公共地线 GND。通信时,数据以 数据帧 为单位逐位传输,从低位(LSB)开始,到高位(MSB)结束。
上图展示了 UART 的物理连接与典型数据帧结构。空闲时 TXD 线保持高电平;发送开始时,TXD 线拉低一个位周期,表示 起始位;随后依次发送数据位(LSB first);可选的校验位用于检错;最后以 停止位(高电平)结束帧传输。
1.2 核心参数详解
UART 通信的成败取决于收发双方对以下四个参数的完全一致配置。任何参数不匹配都会导致数据错乱或完全无法通信。
| 参数 | 说明 | 常见值 | 调试要点 |
|---|---|---|---|
| 波特率 | 每秒传输的符号数(位/秒),决定通信速度 | 9600, 115200, 921600 | Android 内核调试串口常用 115200 |
| 数据位 | 每个数据帧中实际数据的位数 | 7, 8 | 通常使用 8 位,兼容 ASCII 与二进制 |
| 停止位 | 帧结束标志,提供帧间同步间隔 | 1, 1.5, 2 | 常用 1 位停止位 |
| 校验位 | 检错机制:奇校验、偶校验、无校验 | None, Odd, Even | 调试场景通常 无校验 |
1.3 波特率详解与误差容限
波特率是 UART 通信中最关键的参数。它决定了每一位的传输时间:位时间 (s) = 1 / 波特率。例如 115200 bps 的位时间约为 8.68 μs。
由于 UART 是异步通信,收发双方各自使用本地时钟采样。采样点通常位于每位的中点(第 8 个时钟周期附近)。波特率误差会导致采样点偏移,最终引发帧错误。
工程上要求波特率误差不超过 ±2%(理想情况下应 ±1%)。在 Android 内核中,UART 驱动通过 时钟分频 计算波特率发生器寄存器的值。常见 SoC 的 UART 时钟源频率不同,驱动工程师需要核对 时钟树 与 分频系数 以确保实际波特率在容限范围内。
clk_uart 的时钟频率与 uart_clk_div 寄存器配置。
1.4 数据位、停止位与校验位的作用
- 数据位:决定每个帧携带的有效数据位数。7 位适用于纯 ASCII 字符传输;8 位是通用标准,支持 0~255 的字节值。Android 驱动调试中几乎只用 8 位。
- 停止位:提供帧间间隔,帮助接收端识别帧边界。1 位停止位效率最高;2 位停止位用于低速或噪声环境,增加容错。调试场景默认 1 位。
- 校验位:奇校验保证数据位 + 校验位中“1”的个数为奇数;偶校验为偶数。校验位只能检测奇数个位翻转,不能纠错。现代高速调试链路通常 关闭校验 以提升吞吐量。
1.5 常见 UART 参数组合速查表
| 应用场景 | 波特率 | 数据位 | 校验位 | 停止位 | 简称 |
|---|---|---|---|---|---|
| Android 内核调试 | 115200 | 8 | None | 1 | 115200 8N1 |
| GPS 模块通信 | 9600 | 8 | None | 1 | 9600 8N1 |
| 蓝牙 HCI UART | 921600 | 8 | None | 1 | 921600 8N1 |
| 工业 Modbus | 19200 | 8 | Even | 1 | 19200 8E1 |
| 老旧终端 | 2400 | 7 | Even | 2 | 2400 7E2 |
1.6 硬件流控简介
除了上述基本参数,UART 还支持硬件流控(RTS/CTS)以防止数据溢出。在 Android 驱动调试场景中,大多数内核 log 输出不使用硬件流控,仅使用 TXD/RXD/GND 三线。但如果涉及 蓝牙 UART 或 高速传感器数据流,硬件流控是必须启用的。
- RTS(Request to Send):输出信号,表示本设备是否准备好接收数据。
- CTS(Clear to Send):输入信号,表示对端设备是否允许本设备发送数据。
- 流控模式:自动流控(Auto Flow Control) 由 UART 硬件自动管理 RTS/CTS,无需软件干预。
uart-has-rtscts; 属性使能。如果硬件未连接 RTS/CTS 线但 DTS 中错误使能了流控,会导致 TX 被 CTS 拉低而无法发送数据——这是调试串口“无输出”的常见原因之一。
1.7 本章小结
UART 作为 Android 驱动调试的“生命线”,其基础概念必须扎实掌握:
- 异步、全双工、串行通信,无需时钟线。
- 数据帧由起始位、数据位、校验位、停止位组成。
- 波特率误差必须控制在 ±2% 以内,否则采样点偏移导致通信失败。
- Android 内核调试默认配置为 115200 8N1。
- 硬件流控(RTS/CTS)在特定场景下必须正确配置。