UART 与串口描述的是嵌入式系统中最常见的异步串行通信方式:UART 是芯片里的收发硬件模块,串口是工程上对这类物理连接、通信参数和操作系统设备节点的统称。
vault 中已有一篇普通笔记 UART,这张卡片聚焦术语边界和排障模型。
核心问题
两个数字设备要交换少量字节,不一定需要复杂总线。最小可用方案是:双方约定波特率和帧格式,一边按时间节拍把字节拆成 bit 发出去,另一边按同样节拍采样还原字节。
UART/串口解决的是“用少量线缆、低成本硬件、简单软件栈做点对点或低速设备通信”的问题。它常用于:
- 启动日志和调试控制台。
- MCU 与传感器、蓝牙/Wi-Fi/GNSS 模块通信。
- PC 通过 USB 转串口访问设备。
- 工业设备的低速控制和配置链路。
- 设备的 下行口。
核心对象
| 对象 | 含义 | 工程关注点 |
|---|---|---|
| UART controller | 芯片内部的异步串行收发硬件 | 寄存器、FIFO、中断、DMA、波特率分频 |
TX | Transmit,发送引脚 | TTL 串口中要接对端 RX |
RX | Receive,接收引脚 | TTL 串口中要接对端 TX |
GND | 公共参考地 | TTL/CMOS 串口通常必须共地 |
| baud rate | 波特率,每秒符号数 | 双方必须一致,常见 9600、115200、921600 |
| frame format | 帧格式 | 数据位、校验位、停止位要一致 |
| transceiver | 电平转换或差分收发芯片 | TTL、RS-232、RS-485 的电气层不同 |
| tty device | 操作系统中的串口设备节点 | Linux 常见 /dev/ttyS*、/dev/ttyUSB*、/dev/ttyACM* |
核心机制
1. 异步传输依赖双方约定时钟
UART 没有单独时钟线。发送方和接收方提前约定波特率,接收方在检测到起始位后按本地时钟采样。
一个常见 8N1 帧可以写成:
idle start data bits stop
1 0 D0 D1 D2 D3 D4 D5 D6 D7 1其中:
8表示 8 个数据位。N表示 no parity,没有奇偶校验位。1表示 1 个停止位。D0先发,表示低位先行。
如果波特率或帧格式不一致,接收方会在错误时间点采样,表现为乱码、丢字节、校验错误或 framing error。
2. UART 不是电平标准
UART 描述的是异步串行收发逻辑,不等于某一种电压。工程上常见几种承载方式:
| 说法 | 典型含义 | 关键区别 |
|---|---|---|
| TTL/CMOS 串口 | MCU 引脚直接输出 3.3V 或 5V 逻辑 | 短距离、共地、不能直接接 RS-232 |
| RS-232 | 使用正负电压和反相逻辑的传统串口电气标准 | 常见于老式 PC/工业设备,电平不同 |
| RS-485 | 差分半双工或全双工电气层 | 适合长距离、多节点、抗干扰 |
| USB 转串口 | PC 侧 USB,设备侧 UART/RS-232/RS-485 | Linux 下常见 /dev/ttyUSB* |
把 TTL 串口直接接到 RS-232 口可能损坏设备;把 RS-485 的 A/B 线当成 UART 的 TX/RX 接也不会工作。
3. 软件看到的是字节流
多数操作系统把串口抽象成字节流设备。应用常做:
open("/dev/ttyUSB0")
set baud=115200, data=8, parity=none, stop=1
write(command_bytes)
read(response_bytes)串口本身不理解“命令”“寄存器”“地址”“校验和”。这些属于上层 线上协议 或设备私有协议。比如 Modbus RTU 会在串口字节流上再定义地址、功能码、寄存器和 CRC。
工程用途
- bring-up:通过串口看 bootloader、kernel 和早期用户态日志。
- 设备调试:进入 shell、发送 AT 指令、读取传感器状态。
- 模块通信:连接 GNSS、蓝牙、Wi-Fi、4G、IMU 或电机驱动模块。
- 工业控制:通过 RS-485 承载多节点轮询协议。
- 制造测试:生产线使用串口烧录、校准、读取 SN 或执行自检。
调试串口问题时,通常按这个顺序查:
电平标准 -> GND/接线 -> TX/RX 交叉 -> 波特率 -> 8N1/校验 -> 协议帧 -> 应用逻辑边界与常见坑
- UART 不等于 RS-232/RS-485:UART 是收发逻辑,RS-232/RS-485 是电气层或物理层标准。
- 串口不自带地址和重传:点对点 UART 字节流没有网络意义上的路由、确认、拥塞控制。
- TX/RX 方向以本设备命名:本设备
TX要接对端RX,不是同名相接。 - 只接 TX/RX 不一定够:TTL 串口通常还要共地;某些 RS-232 设备还依赖 RTS/CTS 等流控线。
/dev/ttyUSB0不稳定:插拔顺序变化会改变编号,量产或长期部署应结合 udev、serial 或 USB path 固定命名。- 乱码优先查参数和电平:乱码不一定是协议错,常见原因是波特率、校验位、电平标准或地线问题。