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接收以及实际项目中的调试思路。二、什么是USARTUSART的英文全称是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两者最大的区别在于是否支持同步通信。对比项UARTUSART全称Universal Asynchronous Receiver/TransmitterUniversal 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个数据位而是会自动加上起始位、可选校验位和停止位。一帧典型数据通常包括空闲状态 起始位 数据位 可选校验位 停止位典型顺序如下空闲高电平 ↓ 起始位低电平 ↓ 数据位D0D7 ↓ 可选校验位 ↓ 停止位高电平 ↓ 回到空闲高电平1. 空闲状态USART异步串口在没有发送数据时线路通常保持高电平。也就是空闲状态 高电平2. 起始位起始位通常为低电平。当接收方检测到线路从高电平变成低电平时会认为一帧数据即将开始。起始位的作用是告诉接收方新的一帧数据开始了。3. 数据位数据位是真正传输的数据内容。常见数据位长度包括7位 8位 9位最常见的是8位数据位。USART异步模式下数据通常是低位先发送也就是D0先发送 D7后发送4. 校验位校验位是可选的用于简单检测数据错误。常见校验方式包括无校验 奇校验 偶校验5. 停止位停止位通常为高电平。常见停止位配置包括1位停止位 1.5位停止位 2位停止位最常见的是1位停止位。停止位表示当前这一帧数据结束同时让线路回到空闲状态。七、什么是8N18N1是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、GNDTX、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. TXETXE通常表示发送数据寄存器为空也就是说CPU可以继续向发送寄存器写入下一个字节。但是要注意TXE置位不一定代表最后一个字节已经完全从TX引脚发出。它更多表示发送数据寄存器可以继续写入。2. TCTC通常表示发送完成也就是发送数据寄存器和移位寄存器中的内容都已经发送完。如果需要在发送结束后立即关闭发送器、切换RS485方向或者拉低控制引脚通常应该等待TC而不是只等待TXE。十三、USART接收流程USART接收数据时通常经历以下过程RX检测到起始位 ↓ 按照波特率或时钟节拍采样 ↓ 还原数据位 ↓ 检查校验位和停止位 ↓ 数据写入接收数据寄存器 ↓ RXNE标志置位 ↓ CPU读取接收数据RXNERXNE通常表示接收数据寄存器非空也就是已经收到了一个新字节。程序应及时读取接收寄存器。如果没有及时读取下一个字节又到来就可能发生接收溢出。十四、USART常见状态标志不同芯片或不同库函数中USART状态标志的名称可能不完全一样但含义通常比较接近。常见状态标志如下标志常见含义TXE发送数据寄存器为空TC发送完成RXNE接收数据寄存器非空IDLE检测到总线空闲ORE接收溢出错误FE帧错误PE校验错误1. IDLEIDLE表示总线空闲在不定长数据接收中非常常用。例如接收一包长度不固定的数据可以使用DMA IDLE中断基本思路是DMA持续搬运接收数据 ↓ USART检测到一段时间没有新数据 ↓ 触发IDLE中断 ↓ 程序计算本次收到的数据长度 ↓ 处理这一包数据2. OREORE表示接收溢出错误常见原因是CPU没有及时读取接收数据寄存器。比如中断处理太慢中断被长时间关闭波特率过高接收缓冲区太小在中断中执行了复杂逻辑主循环处理不及时。3. FEFE表示帧错误常见原因包括波特率错误停止位配置不同电平异常干扰严重接收端采样时刻偏移。4. PEPE表示校验错误常见原因包括双方校验位配置不同信号干扰波特率偏差数据采样错误。十五、USART中断和DMA有什么用1. 中断接收中断接收适合逐字节处理。基本流程为收到一个字节 ↓ RXNE置位 ↓ 进入USART中断 ↓ 读取数据寄存器 ↓ 放入软件缓冲区 ↓ 退出中断中断服务函数中应尽量只做简单操作。推荐在中断中完成读取数据放入缓冲区更新接收计数设置标志位。不建议在中断中完成大量字符串解析长时间循环Flash写入打印日志等待其他事件复杂协议处理。2. DMA接收DMA适合高速、连续、大量数据接收。DMA可以自动把USART接收寄存器中的数据搬运到内存中减少CPU中断次数。常见用法包括固定长度DMA接收 循环DMA接收 DMA IDLE不定长接收3. DMA IDLEDMA 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. USARTUSART主要描述数据如何收发包括起始位数据位校验位停止位波特率发送和接收状态标志中断和DMA。2. TTL串口TTL串口主要描述电平标准。常见电平为3.3V 5V单片机的TX和RX通常属于TTL或CMOS电平。3. RS232RS232使用不同于TTL的电压范围和逻辑定义。MCU的TTL串口不能直接连接标准RS232接口。通常需要电平转换芯片例如MAX2324. RS485RS485使用差分信号适合长距离和工业现场通信。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异步模式SPII2C时钟方式异步无单独时钟线同步有SCLK同步有SCL常见信号线TX、RX、GNDSCLK、MOSI、MISO、CSSCL、SDA通信方向全双工全双工通常半双工理解设备选择无统一地址依靠CS片选依靠设备地址ACK机制无统一ACK无统一ACK有ACK/NACK常见用途调试、模块通信、日志输出Flash、屏幕、ADC传感器、EEPROMUSART异步模式最大的优势是接线简单调试方便上位机工具多适合日志输出适合模块通信。不足是没有统一地址机制没有统一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通信系统”的关键一步。