UART 通信学习笔记
一、UART 概述
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种异步串行通信协议,用于在设备之间**逐位(bit-by-bit)**传输数据。
关键词:异步(无时钟线)、串行(一位一位发)、全双工(可同时收发)。
二、硬件连接(核心)
UART 最少仅需2 根信号线即可通信:
| 信号名 | 全称 | 方向 | 作用 |
|---|---|---|---|
| TX | Transmit | 输出 | 发送数据 |
| RX | Receive | 输入 | 接收数据 |
| GND | Ground | 公共 | 提供参考电平(必须接) |
连接方式(交叉连接)
设备 A 设备 B
TX ------> RX
RX <------ TX
GND ------- GND
⚠️注意:TX 接 RX,RX 接 TX,千万不要直连!
三、数据帧结构(协议核心)
UART 没有时钟线,依靠约定好的时间间隔来解析数据。
1️⃣ 一帧数据的组成
空闲位 → 起始位 → 数据位 → 校验位(可选) → 停止位
| 字段 | 电平 | 长度 | 时间宽度 | 说明 |
|---|---|---|---|---|
| 空闲位 | 高电平 (1) | — | — | 无数据传输时的默认状态 |
| 起始位 | 低电平 (0) | 1 bit | 1 / BaudRate 秒 | 触发通信开始的标志 |
| 数据位 | 0 或 1 | 5–9 bit | n × (1/BaudRate) 秒 | 通常为 8 bit,LSB 先发 |
| 校验位 | 0 或 1 | 0 / 1 bit | 1 / BaudRate 秒 | 奇校验 / 偶校验(可选) |
| 停止位 | 高电平 (1) | 1 / 1.5 / 2 bit | n / BaudRate 秒 | 标志一帧数据结束 |
2️⃣ 起始位详解
起始位是异步通信的“同步锚点”。
- 电平特征:从高电平跳变到低电平(下降沿)。
- 时间宽度:Tstart=1BaudRateT_{start} = \dfrac{1}{\text{BaudRate}}Tstart=BaudRate1秒。
- 核心作用:
- 唤醒接收方:通知接收方数据即将到来。
- 校准采样点:接收方检测到下降沿后,启动内部定时器,并在每位数据的正中间进行采样(通常为第 1.5 个 Bit 时间处开始采第一位数)。
- 消除累积误差:每接收到一个新字节,时钟重新同步一次。
3️⃣ 停止位详解
停止位是帧的“结束标志”和“缓冲区”。
- 电平特征:拉回高电平(上升沿)。
- 时间宽度:
- 1 位停止位:1BaudRate\dfrac{1}{\text{BaudRate}}BaudRate1秒
- 1.5 位停止位:1.5BaudRate\dfrac{1.5}{\text{BaudRate}}BaudRate1.5秒(主要用于欧洲标准)
- 2 位停止位:2BaudRate\dfrac{2}{\text{BaudRate}}BaudRate2秒
- 核心作用:
- 标志结束:明确告知接收方该字节已传输完毕。
- 提供缓冲时间:给接收方的硬件(UART 控制器)留出处理时间,将数据移入内存,准备接收下一帧。
- 防止帧粘连:确保两帧之间有明确的电平跳变间隔。
4️⃣ 时间宽度统一公式
每一个比特(Bit)的持续时间都是相同的:
Tbit=1BaudRate (秒)T_{bit} = \frac{1}{\text{BaudRate}} \text{ (秒)}Tbit=BaudRate1(秒)
举例:波特率为9600 bps
- 每位时间 =1/9600≈104.17μs1 / 9600 \approx 104.17 \mu s1/9600≈104.17μs
- 起始位 =104.17μs104.17 \mu s104.17μs
- 数据位 =8×104.17μs=833.36μs8 \times 104.17 \mu s = 833.36 \mu s8×104.17μs=833.36μs
- 停止位 =104.17μs104.17 \mu s104.17μs
5️⃣ 标准配置示例
8N1:8 位数据 + 无校验 + 1 位停止位 (最常用)
四、波特率(Baud Rate)
波特率 = 每秒传输的符号数(bps)。
| 波特率 | 说明 |
|---|---|
| 9600 | 低速、抗干扰强 |
| 115200 | 最常用 |
| 921600 | 高速传输 |
波特率误差
双方设备的波特率允许存在±2% ~ ±3%的误差,否则会导致采样错位,产生乱码。
五、UART 工作流程
发送端 (TX)
- 空闲时保持高电平。
- 拉低电平,发送起始位(持续1/BaudRate1/BaudRate1/BaudRate秒)。
- 从低位(LSB)到高位,逐位发送数据位。
- 发送校验位(若启用)。
- 拉高电平,发送停止位(持续n/BaudRaten/BaudRaten/BaudRate秒)。
接收端 (RX)
- 监听:持续监测 RX 线电平。
- 触发:检测到高 → 低的下降沿(起始位)。
- 采样:启动定时器,在每位数据的中间时刻读取电平。
- 校验:检查奇偶校验位(若启用)。
- 停止:确认停止位为高电平,将接收到的字节存入缓冲区。
六、电气标准(物理层)
UART 是逻辑协议,具体电平由物理层标准决定:
| 标准 | 电平 | 说明 |
|---|---|---|
| TTL UART | 0V / 3.3V 或 5V | 单片机常用(开发板上的引脚) |
| RS232 | ±3V ~ ±15V | PC 老式串口,抗干扰强 |
| RS485 | 差分信号 | 工业现场,长距离,多点通信 |
⚠️电平匹配警告:3.3V MCU 不能直接接 5V UART,需电平转换芯片(如 TXS0108E)。
七、流控(Flow Control)
防止接收方处理不过来导致数据丢失。
| 方式 | 信号 | 说明 |
|---|---|---|
| 无流控 | — | 最简单,适用于短距离 |
| 硬件流控 | RTS / CTS | Request to Send / Clear to Send |
| 软件流控 | XON / XOFF | 发送特定 ASCII 字符控制 |
八、UART vs SPI vs IIC
| 特性 | UART | SPI | IIC |
|---|---|---|---|
| 同步/异步 | 异步 | 同步 | 同步 |
| 线数 | 2 (TX/RX) | 4 (MOSI/MISO/SCK/CS) | 2 (SDA/SCL) |
| 速度 | 中 | 快 | 较慢 |
| 全双工 | ✅ | ✅ | ❌ (半双工) |
| 多主设备 | ❌ | ❌ | ✅ |
| 复杂度 | 低 | 中 | 高 |
九、常见问题与坑点
| 问题 | 原因排查 |
|---|---|
| 收不到数据 | TX/RX 接反、未共地、波特率不一致 |
| 数据乱码 | 波特率误差过大、晶振不准、电平不匹配 |
| 丢包/溢出 | 接收中断太慢、缓冲区满、未开启 DMA |
| 死机 | 发送阻塞时间过长、未处理错误标志 |
十、STM32 中的 UART (USART)
STM32 内部集成USART 外设(支持同步/异步)。
十一、一句话总结
UART 是最简单、最稳定的串行通信方式。其核心在于“异步”,通过起始位和停止位界定数据边界,每个比特的持续时间严格等于 1/波特率 秒。
