USART通信详解:USART和UART区别、异步/同步模式、8N1、状态标志与调试方法
一、本文适用场景
USART是嵌入式开发中非常常见的串口通信外设,尤其在STM32、GD32、NXP、TI等单片机中经常出现。
很多初学者在学习串口通信时,经常会遇到下面这些疑问:
- UART和USART到底有什么区别?
- USART为什么比UART多了一个“S”?
- 为什么有些芯片手册写的是USART,但平时却当普通串口使用?
- USART异步模式和UART是不是一回事?
- USART同步模式为什么多了一根CK时钟线?
- 8N1是什么意思?
- USART一帧数据由哪些部分组成?
- TXE、TC、RXNE、IDLE、ORE、FE、PE这些标志分别代表什么?
- 中断接收和DMA接收有什么区别?
- 串口乱码、收不到数据、丢字节应该如何排查?
本文从USART的基础概念开始,依次介绍USART与UART的区别、异步模式、同步模式、数据帧格式、常见状态标志、中断和DMA接收,以及实际项目中的调试思路。
二、什么是USART
USART的英文全称是:
Universal Synchronous/Asynchronous Receiver/Transmitter中文一般称为:
通用同步/异步收发器从名字就可以看出,USART比UART多了一个“S”。
这个“S”代表:
Synchronous,同步也就是说,USART既可以支持异步通信,也可以支持同步通信。
可以简单理解为:
UART:只支持异步通信 USART:既支持异步通信,也支持同步通信在很多单片机中,USART外设通常被配置成异步模式使用,也就是我们平时常说的“串口通信”。
因此在实际开发中,经常会看到这种情况:
芯片手册中外设名称叫USART, 但是项目中把它当UART串口使用。这并不矛盾。
因为USART工作在异步模式时,本质上就是普通UART串口通信。
三、UART和USART有什么区别
UART的全称是:
Universal Asynchronous Receiver/TransmitterUSART的全称是:
Universal Synchronous/Asynchronous Receiver/Transmitter两者最大的区别在于是否支持同步通信。
| 对比项 | UART | USART |
|---|---|---|
| 全称 | Universal Asynchronous Receiver/Transmitter | Universal Synchronous/Asynchronous Receiver/Transmitter |
| 中文含义 | 通用异步收发器 | 通用同步/异步收发器 |
| 是否支持异步通信 | 支持 | 支持 |
| 是否支持同步通信 | 不支持 | 支持 |
| 是否需要时钟线 | 不需要 | 异步模式不需要,同步模式可使用CK |
| 常见信号 | TX、RX、GND | 异步:TX、RX、GND;同步:TX、RX、CK、GND |
| 常见用途 | 普通串口通信 | 普通串口通信,也可用于同步收发场景 |
可以用一句话记住:
UART = 只异步 USART = 异步 + 同步日常开发中,如果只是用TX、RX、GND进行串口收发,那么USART一般就是工作在异步模式。
图1 USART基础与UART的区别
USART既可以工作在异步模式,也可以工作在同步模式。UART只支持异步通信;USART在异步模式下与常见UART串口通信非常接近,在同步模式下则可以额外使用CK时钟线。
四、USART异步模式是什么
USART异步模式是最常见的使用方式。
异步模式下,USART不使用单独的时钟线。
常见信号为:
TX RX GND其中:
TX:发送数据 RX:接收数据 GND:共地异步通信的特点是:
发送方和接收方没有共享时钟线。因此,双方必须提前约定好相同的通信参数,例如:
波特率:115200 数据位:8位 校验位:无 停止位:1位也就是常说的:
115200 8N1如果双方参数不一致,就容易出现乱码、接收错误或者完全无法通信。
五、USART异步模式的常见接线
异步模式下,USART通常按照下面方式连接:
A设备TX → B设备RX A设备RX ← B设备TX A设备GND ↔ B设备GND也就是说:
TX和RX需要交叉连接 GND需要共地不能接成:
TX接TX RX接RX因为TX是发送端,RX是接收端。
正确原则是:
一个设备的发送端,连接另一个设备的接收端。如果只需要单向发送,例如A设备只向B设备发送日志,那么可以只连接:
A设备TX → B设备RX A设备GND ↔ B设备GND但是如果需要双向通信,就必须同时连接TX和RX两条数据线。
六、USART异步模式一帧数据由什么组成
USART异步模式发送数据时,不是只发送8个数据位,而是会自动加上起始位、可选校验位和停止位。
一帧典型数据通常包括:
空闲状态 起始位 数据位 可选校验位 停止位典型顺序如下:
空闲高电平 ↓ 起始位低电平 ↓ 数据位D0~D7 ↓ 可选校验位 ↓ 停止位高电平 ↓ 回到空闲高电平1. 空闲状态
USART异步串口在没有发送数据时,线路通常保持高电平。
也就是:
空闲状态 = 高电平2. 起始位
起始位通常为低电平。
当接收方检测到线路从高电平变成低电平时,会认为一帧数据即将开始。
起始位的作用是:
告诉接收方:新的一帧数据开始了。3. 数据位
数据位是真正传输的数据内容。
常见数据位长度包括:
7位 8位 9位最常见的是8位数据位。
USART异步模式下,数据通常是低位先发送,也就是:
D0先发送 D7后发送4. 校验位
校验位是可选的,用于简单检测数据错误。
常见校验方式包括:
无校验 奇校验 偶校验5. 停止位
停止位通常为高电平。
常见停止位配置包括:
1位停止位 1.5位停止位 2位停止位最常见的是1位停止位。
停止位表示当前这一帧数据结束,同时让线路回到空闲状态。
七、什么是8N1
8N1是USART异步通信中最常见的数据格式。
它的含义是:
8 = 8个数据位 N = No Parity,无校验 1 = 1个停止位因此:
115200 8N1表示:
波特率:115200 数据位:8位 校验位:无 停止位:1位这是很多单片机调试、串口助手通信、模块通信中最常见的配置。
8N1实际占多少位
虽然有效数据是1个字节,也就是8位,但8N1真正在线路上传输时,还包含:
1个起始位 8个数据位 1个停止位总共为:
1 + 8 + 1 = 10位所以,发送1个字节有效数据,实际需要10个比特时间。
例如波特率为115200时,理论最大有效字节速率约为:
115200 / 10 = 11520 字节/秒这只是理论值,实际还会受到软件处理、协议开销和缓冲区影响。
图2 USART异步模式与数据帧格式
USART工作在异步模式时,不使用单独时钟线,通信双方通过提前约定波特率和数据格式完成收发。最常见的格式是8N1,即8个数据位、无校验、1个停止位。
八、为什么波特率不一致会乱码
USART异步通信没有单独时钟线。
发送方和接收方各自根据自己的时钟进行发送和采样。
波特率决定了每一位数据持续多长时间。
例如:
115200 bit/s表示每秒大约传输115200个比特。
每个比特时间约为:
1 / 115200 ≈ 8.68微秒接收方检测到起始位后,会根据配置的波特率,在每一个数据位的中间位置附近进行采样。
如果发送方和接收方波特率不一致,就会出现采样点偏移。
刚开始可能偏移不明显,但随着数据位增加,偏差会不断累积。
最终接收方可能采到错误的位,导致:
- 乱码;
- 数据错位;
- 偶尔正确;
- 偶尔错误;
- 帧错误;
- 校验错误。
因此,USART通信双方必须保证:
波特率一致 数据位一致 校验位一致 停止位一致九、USART同步模式是什么
USART同步模式相比异步模式,多了一个时钟信号:
CK同步模式常见信号包括:
TX RX CK GND其中:
TX:发送数据 RX:接收数据 CK:时钟线 GND:参考地在同步模式下,CK通常由主设备提供。
通信双方按照CK时钟节拍完成数据发送和接收。
也就是说:
异步模式:靠双方提前约定波特率 同步模式:靠CK时钟同步采样同步模式的特点包括:
- 有明确的时钟信号;
- 数据采样时刻更容易对齐;
- 对时序要求更明确;
- 引脚数量更多;
- 配置更复杂;
- 使用频率低于普通异步串口。
在日常串口调试、日志输出、串口助手通信中,大多数情况下使用的是异步模式,而不是同步模式。
十、USART同步模式通信过程
USART同步模式的典型通信过程可以理解为:
主设备输出CK时钟 ↓ 发送端在TX线上放置数据 ↓ 接收端根据CK时钟边沿采样 ↓ 双方按照相同节拍完成收发同步模式下,CK的作用类似于“节拍器”。
它告诉接收方:
应该在什么时候读取数据。相比异步模式,接收方不再完全依赖自身波特率估算采样时刻,而是根据外部时钟配合接收。
不过,不同芯片对USART同步模式的支持情况、CK极性、CK相位和引脚复用方式可能不同。
实际使用时必须查看芯片参考手册。
十一、USART同步模式和异步模式对比
| 对比项 | 异步模式 | 同步模式 |
|---|---|---|
| 是否有时钟线 | 无单独时钟线 | 有CK时钟线 |
| 常见信号 | TX、RX、GND | TX、RX、CK、GND |
| 采样依据 | 靠波特率约定 | 靠CK时钟同步 |
| 使用复杂度 | 较低 | 较高 |
| 常见用途 | 调试日志、模块通信、串口助手 | 对同步时序有要求的场景 |
| 使用频率 | 最常见 | 相对较少 |
可以简单记住:
异步模式 = TX + RX + GND 同步模式 = TX + RX + CK + GND图3 USART同步模式通信原理
USART同步模式下,除了TX和RX,还会使用CK时钟线。CK通常由主设备提供,数据在时钟配合下完成同步采样和传输。
十二、USART发送流程
USART发送数据时,通常经历以下过程:
CPU写入发送数据寄存器 ↓ USART硬件开始移位发送 ↓ TX线上逐位输出 ↓ 发送寄存器空,允许写入下一个字节 ↓ 整个数据帧发送完成在很多单片机中,发送相关标志包括:
TXE TC1. TXE
TXE通常表示:
发送数据寄存器为空也就是说,CPU可以继续向发送寄存器写入下一个字节。
但是要注意:
TXE置位不一定代表最后一个字节已经完全从TX引脚发出。
它更多表示发送数据寄存器可以继续写入。
2. TC
TC通常表示:
发送完成也就是发送数据寄存器和移位寄存器中的内容都已经发送完。
如果需要在发送结束后立即关闭发送器、切换RS485方向或者拉低控制引脚,通常应该等待TC,而不是只等待TXE。
十三、USART接收流程
USART接收数据时,通常经历以下过程:
RX检测到起始位 ↓ 按照波特率或时钟节拍采样 ↓ 还原数据位 ↓ 检查校验位和停止位 ↓ 数据写入接收数据寄存器 ↓ RXNE标志置位 ↓ CPU读取接收数据RXNE
RXNE通常表示:
接收数据寄存器非空也就是已经收到了一个新字节。
程序应及时读取接收寄存器。
如果没有及时读取,下一个字节又到来,就可能发生接收溢出。
十四、USART常见状态标志
不同芯片或不同库函数中,USART状态标志的名称可能不完全一样,但含义通常比较接近。
常见状态标志如下:
| 标志 | 常见含义 |
|---|---|
| TXE | 发送数据寄存器为空 |
| TC | 发送完成 |
| RXNE | 接收数据寄存器非空 |
| IDLE | 检测到总线空闲 |
| ORE | 接收溢出错误 |
| FE | 帧错误 |
| PE | 校验错误 |
1. IDLE
IDLE表示:
总线空闲在不定长数据接收中非常常用。
例如接收一包长度不固定的数据,可以使用:
DMA + IDLE中断基本思路是:
DMA持续搬运接收数据 ↓ USART检测到一段时间没有新数据 ↓ 触发IDLE中断 ↓ 程序计算本次收到的数据长度 ↓ 处理这一包数据2. ORE
ORE表示:
接收溢出错误常见原因是CPU没有及时读取接收数据寄存器。
比如:
- 中断处理太慢;
- 中断被长时间关闭;
- 波特率过高;
- 接收缓冲区太小;
- 在中断中执行了复杂逻辑;
- 主循环处理不及时。
3. FE
FE表示:
帧错误常见原因包括:
- 波特率错误;
- 停止位配置不同;
- 电平异常;
- 干扰严重;
- 接收端采样时刻偏移。
4. PE
PE表示:
校验错误常见原因包括:
- 双方校验位配置不同;
- 信号干扰;
- 波特率偏差;
- 数据采样错误。
十五、USART中断和DMA有什么用
1. 中断接收
中断接收适合逐字节处理。
基本流程为:
收到一个字节 ↓ RXNE置位 ↓ 进入USART中断 ↓ 读取数据寄存器 ↓ 放入软件缓冲区 ↓ 退出中断中断服务函数中应尽量只做简单操作。
推荐在中断中完成:
- 读取数据;
- 放入缓冲区;
- 更新接收计数;
- 设置标志位。
不建议在中断中完成:
- 大量字符串解析;
- 长时间循环;
- Flash写入;
- 打印日志;
- 等待其他事件;
- 复杂协议处理。
2. DMA接收
DMA适合高速、连续、大量数据接收。
DMA可以自动把USART接收寄存器中的数据搬运到内存中,减少CPU中断次数。
常见用法包括:
固定长度DMA接收 循环DMA接收 DMA + IDLE不定长接收3. DMA + IDLE
DMA + IDLE是USART不定长数据接收中非常常见的方案。
适合下面这种场景:
不知道一帧数据具体什么时候结束 但帧与帧之间有空闲间隔当USART检测到一段时间没有新数据,就产生IDLE中断,程序再计算DMA缓冲区中已经收到多少数据。
图4 USART发送、接收、状态标志、中断和DMA
发送数据时重点关注TXE和TC;接收数据时重点关注RXNE;不定长数据接收常配合DMA和IDLE空闲中断。
十六、USART为什么会乱码
USART乱码通常与以下问题有关:
- 波特率不一致;
- 数据位不同;
- 校验位不同;
- 停止位不同;
- TTL、RS232、RS485电平标准不匹配;
- TX和RX接错;
- GND没有共地;
- 晶振误差较大;
- 干扰较强;
- 上位机串口工具配置错误;
- 程序发送的是二进制数据,但串口工具按文本显示;
- 中文编码不一致。
其中最常见的是:
波特率不一致 8N1配置不一致如果串口助手显示乱码,建议先检查:
波特率 数据位 校验位 停止位十七、USART收不到数据怎么排查
收不到数据时,可以按照下面顺序检查:
1. 对方是否真的发送数据 2. TX和RX是否交叉连接 3. GND是否共地 4. RX引脚是否配置正确 5. GPIO复用是否正确 6. USART外设时钟是否开启 7. 波特率是否一致 8. 数据格式是否一致 9. 接收中断是否开启 10. NVIC是否配置 11. DMA是否启动 12. 是否读取了错误的USART实例最简单的判断方式是:
用逻辑分析仪或示波器直接看RX引脚是否有波形。如果RX引脚没有波形,优先排查硬件接线和对方设备。
如果RX引脚有正常波形,但程序收不到,优先排查USART配置、中断、DMA和软件逻辑。
十八、USART丢字节怎么排查
丢字节通常说明:
数据到达速度 > 软件处理速度常见原因包括:
- 中断响应不及时;
- 中断中处理时间太长;
- 接收缓冲区太小;
- DMA缓冲区被覆盖;
- 环形缓冲区写满;
- 主循环处理太慢;
- 高优先级中断长期占用CPU;
- 波特率过高;
- 关闭中断时间过长。
解决思路包括:
- 增大接收缓冲区;
- 使用环形缓冲区;
- 使用DMA;
- 缩短中断处理时间;
- 将协议解析放到任务或主循环中;
- 降低波特率;
- 增加流控;
- 优化任务优先级。
十九、USART帧错误怎么排查
帧错误通常表示:
应该出现停止位的位置,没有检测到正确的高电平。常见原因包括:
- 波特率错误;
- 停止位配置不一致;
- 数据线干扰;
- 电平标准错误;
- 接地异常;
- 信号反相;
- 发送端格式错误。
调试时可以用逻辑分析仪观察:
空闲电平是否为高 是否出现起始位下降沿 位宽是否对应目标波特率 停止位是否恢复高电平二十、USART推荐调试顺序
实际项目中,USART异常可以按以下顺序排查:
第1步:确认供电正常 第2步:确认TX和RX交叉连接 第3步:确认GND共地 第4步:确认电平标准匹配 第5步:确认波特率一致 第6步:确认数据位、校验位、停止位一致 第7步:确认GPIO复用正确 第8步:确认USART外设时钟已开启 第9步:确认中断或DMA已经正确配置 第10步:发送0x55或0xAA观察波形 第11步:用逻辑分析仪测量位宽 第12步:检查TXE、TC、RXNE、ORE、FE等标志 第13步:最后再排查业务协议解析调试时不要一开始就怀疑复杂业务逻辑。
最常见的问题往往是:
接线错误 参数不一致 电平不匹配 中断或DMA没有正确配置图5 USART调试技巧与常见问题
USART出现乱码、收不到数据、丢字节或帧错误时,应先检查接线、共地、波特率、数据格式和电平标准,再检查中断、DMA、缓冲区和软件逻辑。
二十一、USART与TTL、RS232、RS485的关系
很多人容易把USART和TTL、RS232、RS485混在一起。
实际上它们关注的层次不同。
1. USART
USART主要描述:
数据如何收发包括:
- 起始位;
- 数据位;
- 校验位;
- 停止位;
- 波特率;
- 发送和接收;
- 状态标志;
- 中断和DMA。
2. TTL串口
TTL串口主要描述电平标准。
常见电平为:
3.3V 5V单片机的TX和RX通常属于TTL或CMOS电平。
3. RS232
RS232使用不同于TTL的电压范围和逻辑定义。
MCU的TTL串口不能直接连接标准RS232接口。
通常需要电平转换芯片,例如:
MAX2324. RS485
RS485使用差分信号,适合长距离和工业现场通信。
MCU的USART通常需要通过RS485收发器连接到RS485总线。
常见芯片包括:
MAX485 SP3485可以简单理解为:
USART负责数据格式 TTL / RS232 / RS485负责电气接口二十二、USART工程实践建议
1. 初始化后先打印固定字符串
例如:
printf("USART INIT OK\r\n");或者:
usart_send_string("USART INIT OK\r\n");这样可以快速验证:
- TX是否正常;
- 波特率是否正确;
- 上位机串口工具是否配置正确;
- 发送路径是否打通。
2. 接收中断只做轻量操作
中断中建议只做:
读取数据 放入缓冲区 设置标志位复杂协议解析应该放在主循环或任务中。
3. 使用环形缓冲区
USART是连续字节流。
接收数据时,推荐使用环形缓冲区暂存数据。
这样可以避免因为主循环暂时来不及处理而丢字节。
4. 不定长数据推荐DMA + IDLE
对于不定长协议,例如AT指令、串口屏、GPS数据等,DMA + IDLE是非常常见的接收方案。
它可以减少每字节中断,提高效率。
5. 增加错误统计
建议统计以下错误:
- 接收溢出次数;
- 帧错误次数;
- 校验错误次数;
- 缓冲区满次数;
- 协议解析失败次数;
- 通信超时次数。
这些统计信息对排查偶发问题非常有帮助。
二十三、USART和SPI、I2C的区别
| 对比项 | USART异步模式 | SPI | I2C |
|---|---|---|---|
| 时钟方式 | 异步,无单独时钟线 | 同步,有SCLK | 同步,有SCL |
| 常见信号线 | TX、RX、GND | SCLK、MOSI、MISO、CS | SCL、SDA |
| 通信方向 | 全双工 | 全双工 | 通常半双工理解 |
| 设备选择 | 无统一地址 | 依靠CS片选 | 依靠设备地址 |
| ACK机制 | 无统一ACK | 无统一ACK | 有ACK/NACK |
| 常见用途 | 调试、模块通信、日志输出 | Flash、屏幕、ADC | 传感器、EEPROM |
USART异步模式最大的优势是:
- 接线简单;
- 调试方便;
- 上位机工具多;
- 适合日志输出;
- 适合模块通信。
不足是:
- 没有统一地址机制;
- 没有统一ACK;
- 波特率必须一致;
- TTL串口不适合长距离;
- 高速连续数据容易丢字节;
- 应用层协议需要自行设计。
二十四、核心知识总结
学习USART,可以先记住以下结论:
USART全称是通用同步/异步收发器。
UART只支持异步通信。
USART既支持异步通信,也支持同步通信。
USART异步模式就是常见串口通信。
USART异步模式常用TX、RX、GND。
TX和RX需要交叉连接。
双方GND需要共地。
USART同步模式会额外使用CK时钟线。
CK通常由主设备提供。
异步模式靠波特率约定采样时刻。
同步模式靠CK时钟同步采样。
异步模式一帧数据通常包含起始位、数据位、校验位和停止位。
线路空闲通常为高电平。
起始位通常为低电平。
停止位通常为高电平。
数据通常低位先发送。
8N1表示8位数据、无校验、1位停止位。
波特率不一致容易出现乱码。
TXE表示发送数据寄存器为空。
TC表示发送完成。
RXNE表示接收数据寄存器非空。
IDLE常用于不定长数据接收。
ORE表示接收溢出。
FE表示帧错误。
PE表示校验错误。
中断适合逐字节接收。
DMA适合高速连续数据。
DMA + IDLE适合不定长数据帧接收。
调试USART先看接线、共地、参数和电平。
最后再排查中断、DMA、缓冲区和协议解析。
二十五、结语
真正掌握USART,不只是会调用发送函数,而是能够理解整个通信过程:
CPU写入发送数据 ↓ USART硬件添加帧格式 ↓ TX引脚逐位输出 ↓ 对方RX检测起始位 ↓ 按波特率或CK时钟采样 ↓ 还原数据 ↓ 设置RXNE等状态标志 ↓ CPU通过中断、DMA或轮询读取数据调试时,需要把以下几部分对应起来:
硬件接线 + 电平标准 + 波特率和8N1 + USART状态标志 + 中断或DMA + 接收缓冲区 + 逻辑分析仪波形 + 应用层协议当这些内容能够对应起来时,就可以快速判断问题到底发生在:
- TX/RX接线;
- GND共地;
- 电平转换;
- 波特率;
- 数据格式;
- 起始位和停止位;
- 状态标志;
- 中断配置;
- DMA配置;
- 缓冲区;
- 协议解析。
这也是从“会用串口”走向“能独立调试USART通信系统”的关键一步。