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