1. UART基础概念

UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是嵌入式系统中最基础、最常用的串行通信接口。在 Android 驱动开发中,UART 承担着 内核调试信息输出、蓝牙/ GPS / 传感器通信 以及 AT 指令交互 等关键角色。理解 UART 的底层原理,是掌握 Android 驱动调试的第一步。

核心认知:UART 是一种 异步、全双工、串行 通信协议。它不需要时钟线,依靠收发双方预先约定的波特率与数据帧格式完成数据交换。

1.1 UART 通信原理

UART 通信使用两条主要数据线:TXD(发送) 和 RXD(接收),以及一条公共地线 GND。通信时,数据以 数据帧 为单位逐位传输,从低位(LSB)开始,到高位(MSB)结束。

UART 通信连接与数据帧结构 UART 通信连接与数据帧结构 设备 A (TXD → RXD) 设备 B (RXD ← TXD) TXD → RXD RXD ← TXD UART 数据帧结构(8N1 格式) 起始位 0 数据位(8 位) D0 D1 D2 D3 D4 D5 D6 D7 校验位 无 停止位 1

上图展示了 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 调试场景通常 无校验
经验法则:Android 平台早期内核调试(如高通 MSM、MTK、展锐平台)的 UART 默认配置几乎都是 115200 8N1(波特率 115200,8 数据位,无校验,1 停止位)。这是驱动工程师必须牢记的“黄金组合”。

1.3 波特率详解与误差容限

波特率是 UART 通信中最关键的参数。它决定了每一位的传输时间:位时间 (s) = 1 / 波特率。例如 115200 bps 的位时间约为 8.68 μs。

由于 UART 是异步通信,收发双方各自使用本地时钟采样。采样点通常位于每位的中点(第 8 个时钟周期附近)。波特率误差会导致采样点偏移,最终引发帧错误。

波特率误差导致采样点偏移 波特率误差导致采样点偏移 发送端 起始 数据位 (8 位) 停止 接收端 起始 数据位 (采样偏移) 停止 累积误差 → 采样点偏移 → 帧错误

工程上要求波特率误差不超过 ±2%(理想情况下应 ±1%)。在 Android 内核中,UART 驱动通过 时钟分频 计算波特率发生器寄存器的值。常见 SoC 的 UART 时钟源频率不同,驱动工程师需要核对 时钟树 与 分频系数 以确保实际波特率在容限范围内。

常见踩坑点:在 Android 平台切换 UART 时钟源(例如从 26MHz 切换到 19.2MHz)后,如果未更新分频系数,实际波特率可能偏离设定值 5% 以上,导致串口完全无法输出 log。此时应检查 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,无需软件干预。
驱动工程师提示:在 Android 内核设备树(DTS)中,UART 节点的流控配置通常通过 uart-has-rtscts; 属性使能。如果硬件未连接 RTS/CTS 线但 DTS 中错误使能了流控,会导致 TX 被 CTS 拉低而无法发送数据——这是调试串口“无输出”的常见原因之一。

1.7 本章小结

UART 作为 Android 驱动调试的“生命线”,其基础概念必须扎实掌握:

  • 异步、全双工、串行通信,无需时钟线。
  • 数据帧由起始位、数据位、校验位、停止位组成。
  • 波特率误差必须控制在 ±2% 以内,否则采样点偏移导致通信失败。
  • Android 内核调试默认配置为 115200 8N1。
  • 硬件流控(RTS/CTS)在特定场景下必须正确配置。