1. UART协议基础:通信原理、帧格式、波特率、硬件流控、RS232/RS485标准对比

UART,全称是通用异步收发传输器。说白了,它就是让两个设备之间,用一根或两根线就能互相传数据的接口。我刚开始做嵌入式时,觉得它太简单了,不就是发0和1嘛。后来踩了不少坑才发现,越是基础的协议,细节越要抠清楚。

1.1 UART通信原理

UART是异步通信,没有时钟线。收发双方靠约定好的波特率来同步。发送端把并行数据转成串行,一位一位往外发;接收端再把串行数据拼回并行。

为什么叫异步?因为没有独立的时钟信号。你想想看,如果发方和收方各用各的时钟,怎么保证节奏一致?靠的就是波特率。双方提前说好:每秒传多少位。然后各自用自己的时钟去采样。

核心要点:UART通信只需要两根数据线——TX(发送)和RX(接收)。地线必须共地,否则电平参考点不一致,数据会乱。

我在项目中遇到过一个问题:两个板子用UART通信,偶尔丢字节。查了半天,发现是地线没接好,两个板子的GND之间有0.5V的压差。接上地线后,问题立刻消失。嗯,共地这事,千万别省。

1.2 帧格式

UART的帧格式,我习惯叫它“数据包的骨架”。一个完整的UART帧包含以下部分:

  • 起始位(Start Bit):1位,逻辑0。告诉接收方“我要开始发了”。
  • 数据位(Data Bits):5~9位,常用8位。低位在前,高位在后。
  • 校验位(Parity Bit):可选,奇校验或偶校验。用于简单的错误检测。
  • 停止位(Stop Bit):1位或2位,逻辑1。表示帧结束。
帧字段 位数 逻辑电平 说明
起始位 1 0 同步接收时钟
数据位 5~9(常用8) 0或1 低位先发
校验位 0或1 0或1 奇/偶校验
停止位 1或2 1 帧结束标识

个人经验:我建议数据位固定用8位,停止位用1位。这是最通用的配置。用2位停止位会降低吞吐量,除非你遇到时钟漂移严重的场景。

1.3 波特率

波特率就是每秒传输的符号数。对于UART来说,一个符号就是一位,所以波特率等于比特率。常见的波特率有:9600、19200、38400、115200、921600。

为什么是这些数字?因为它们都是从1.8432MHz晶振分频得来的。我记得刚学的时候,总觉得115200比9600快很多,但实际用起来,线缆长了、干扰大了,高速率反而容易出错。

避坑指南:我曾经在一个项目中,把波特率设成了115200,结果在5米长的RS232线缆上频繁丢数据。降到38400后,通信就稳定了。长距离通信,别盲目追求高波特率。

波特率误差也是个坑。收发双方的波特率误差必须在±2%以内,否则采样点会偏移。我一般用示波器量一下实际波形,确认误差在范围内才放心。

1.4 硬件流控

硬件流控,就是用额外的信号线来控制数据流。常用的有RTS(请求发送)和CTS(清除发送)。当接收方缓冲区快满时,拉低RTS,通知发送方暂停。

什么时候需要硬件流控?

  • 高速通信(如921600 bps)时,软件来不及处理。
  • 接收方处理能力不稳定,比如中断响应有延迟。
  • 多设备共享总线时,避免数据碰撞。

我个人习惯:如果通信速率超过115200,或者接收方是低性能MCU,我会加上硬件流控。否则,大部分场景用软件流控(XON/XOFF)就够了。

注意:硬件流控需要双方都支持,并且连线要正确。RTS接对方的CTS,CTS接对方的RTS。交叉连接,别搞反了。

1.5 RS232与RS485标准对比

RS232和RS485,都是UART的电气层标准。UART协议本身只定义了数据格式和时序,电气特性由这些标准来定。

特性 RS232 RS485
传输方式 单端(不平衡) 差分(平衡)
最大距离 约15米 约1200米
最大节点数 1对1 最多256个节点
电压范围 ±3V ~ ±15V ±1.5V ~ ±6V(差分)
抗干扰能力 弱 强
常用场景 调试口、短距离设备 工业总线、多设备组网

RS232是点对点通信,电压摆幅大,但距离短。我调试嵌入式设备时,最喜欢用RS232转USB线,方便又稳定。

RS485是差分信号,抗共模干扰能力强,适合工业环境。而且支持多节点组网,一个主站可以带几十个从站。我在一个工厂项目中,用RS485挂了32个传感器,跑Modbus协议,稳定运行了三年没出过问题。

选型建议:如果只是调试或短距离通信,用RS232。如果是工业现场、长距离、多设备,果断选RS485。别为了省成本用RS232硬扛长距离,你会后悔的。

1.6 知识体系总览

下面这张图,把UART协议的核心知识点串起来了。你可以把它当作本章的思维导图。

UART协议知识体系 UART协议基础 通信原理 帧格式 波特率 硬件流控 RS232 vs RS485 异步、无时钟 TX / RX 两根线 起始/数据/停止 校验位(可选) 9600 / 115200 等 RTS / CTS 流控信号 差分 vs 单端 UART协议 = 数据链路层 + 物理层(RS232/RS485)

这张图把UART协议拆成了五个核心模块:通信原理、帧格式、波特率、硬件流控、RS232/RS485对比。每个模块下面还有关键子节点。你可以用它来快速回顾本章内容。