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 是协议,RS232/RS485 是接口,别搞混了。