UART 基础概念:从协议帧到物理层差异

UART 这东西,说白了就是嵌入式世界里最常用的“串行聊天工具”。我刚开始做嵌入式那会儿,调试手段有限,UART 几乎就是我的眼睛和耳朵。今天咱们就把 UART 的底裤扒干净,从协议帧格式讲到波特率,再聊聊它跟 RS232、RS485 到底有什么区别。

UART 协议帧格式

UART 通信是一帧一帧传的。每一帧就像一封信,有固定的格式。你想想看,两个设备要聊天,总得知道什么时候开始、什么时候结束、数据怎么对齐吧?

标准 UART 帧包含以下几个部分:

  • 起始位:1 位,固定为低电平。告诉接收方“我要开始发数据了”。
  • 数据位:5~9 位,常见的是 8 位。这就是你要传的实际数据。
  • 校验位:0 或 1 位,可选。用于简单的错误检测。
  • 停止位:1、1.5 或 2 位,固定为高电平。告诉接收方“这帧结束了”。

我习惯把 UART 帧想象成这样的结构:

空闲状态(高电平)→ 起始位(低)→ 数据位(LSB 先发)→ 校验位(可选)→ 停止位(高)→ 空闲状态

这里有个细节要注意:数据位是 LSB(最低有效位)先发。也就是说,如果你要发 0x55(二进制 01010101),先发出去的是最低位的 1,而不是最高位的 0。我曾经在项目里吃过这个亏,逻辑分析仪抓出来的波形怎么看都不对,后来才发现是字节序搞反了。

波特率概念

波特率,就是每秒传输的符号数。对于 UART 来说,一个符号就是一 bit,所以波特率就等于比特率。

常见的波特率有:

波特率(bps) 每位时间(μs) 典型应用场景
9600 104.17 调试终端、低速传感器
115200 8.68 常用调试波特率,我基本都用这个
921600 1.09 高速数据传输、固件升级

为什么波特率要匹配?因为收发双方得用同一个“时钟节拍”来采样。发送方按 9600 的节奏发,接收方按 115200 的节奏收,那收到的数据全是乱的。我在项目中遇到过好几次这种问题,排查了半天,最后发现是波特率配置不一致。

我的经验:调试阶段统一用 115200,传输快,省时间。量产阶段如果线长或干扰大,降到 9600 更稳。

UART 与 RS232 / RS485 的区别

很多人把 UART 和 RS232 混为一谈,其实它们不是一回事。UART 是协议层,RS232 和 RS485 是物理层。打个比方:UART 是你要说的话,RS232/RS485 是你用喇叭喊还是用对讲机喊。

特性 UART(TTL 电平) RS232 RS485
电平标准 0V / 3.3V 或 5V -15V ~ +15V 差分信号(A-B)
传输距离 几米 约 15 米 可达 1200 米
通信方式 点对点,全双工 点对点,全双工 多点,半双工
抗干扰能力 弱 中等 强(差分传输)
典型应用 板级通信、MCU 之间 电脑串口、工业设备 工业总线、远距离通信

我简单解释一下:

  • UART(TTL 电平):就是 MCU 直接出来的信号,0V 表示逻辑 0,3.3V 或 5V 表示逻辑 1。距离短,抗干扰差,但简单直接。
  • RS232:把 TTL 电平转换成 ±12V 左右的电压。电压摆幅大,抗干扰比 TTL 好,但距离也就十几米。我记得以前调试 PC 串口,用的就是 RS232 转 TTL 的模块。
  • RS485:用两根线(A 和 B)的电压差来表示数据。差分信号抗共模干扰能力极强,距离可以到上千米。而且支持多设备挂在同一总线上,工业现场非常常见。

避坑指南:千万不要直接把 TTL 电平的 UART 接到 RS232 或 RS485 设备上,会烧芯片。我曾经手贱试过一次,一股青烟飘起来,芯片直接报废。一定要用电平转换芯片,比如 MAX232 或 SP3485。

知识结构图

下面这张图帮你理清 UART、RS232、RS485 的关系:

UART 与 RS232/RS485 关系图 UART 协议与物理层标准关系 UART 协议层 TTL 电平(板级) RS232(点对点) RS485(多点) TTL 特性 0V / 3.3V 距离 < 5m 全双工 RS232 特性 ±12V 电平 距离 ~15m 全双工 RS485 特性 差分信号 距离 ~1200m 半双工 典型应用场景 TTL:MCU 间通信、传感器读取 | RS232:PC 串口、老式设备 | RS485:工业总线、楼宇自动化

总结一下

UART 协议帧格式就是起始位、数据位、校验位、停止位这套规矩。波特率决定了通信速度,两边必须对齐。而 RS232 和 RS485 是 UART 在不同物理层的实现,选哪个取决于你的距离、速度和设备数量需求。

嗯,这一节的内容就这些。记住一句话:UART 是协议,RS232/RS485 是接口,别搞混了。