UART 基础概念:串口通信的“老黄牛”
UART,全称 Universal Asynchronous Receiver/Transmitter,中文叫通用异步收发器。说白了,它就是让两个设备之间通过一根线“聊天”的硬件模块。我最早接触 UART 是在大学做单片机实验的时候,当时觉得这东西太简单了,不就是发个数据嘛。后来在工业现场吃过亏,才明白它背后的门道有多深。
你想想看,两个独立的设备,没有共同的时钟线,怎么保证收发数据的节奏一致?这就是 UART 最巧妙的地方——它用“帧”结构来约定通信规则,每一帧数据都像一个小包裹,拆开来看就清楚了。
UART 的工作原理:帧结构拆解
UART 通信以“帧”为单位。一帧数据通常包含以下几个部分:
- 起始位(Start Bit):逻辑低电平,告诉接收方“准备接收,数据要来了”。
- 数据位(Data Bits):5~9 位,最常见的是 8 位(一个字节)。
- 校验位(Parity Bit):可选,用于简单的错误检测。
- 停止位(Stop Bit):逻辑高电平,表示这一帧结束。
我习惯把 UART 帧比作一列火车:起始位是火车头,数据位是车厢,校验位是安检员,停止位是车尾。接收方看到车头就知道火车来了,数完车厢,检查一下安检员,看到车尾,这一趟就结束了。
关键参数:波特率(Baud Rate)
波特率决定了每秒传输多少位。常见的有 9600、115200。收发双方的波特率必须一致,否则数据就会错乱。我曾经在调试一个 GPS 模块时,把波特率设成了 9600,但模块默认是 115200,结果收到的全是乱码。折腾了半小时才发现是这个问题。
避坑指南
我曾经遇到过一块电路板,UART 通信时好时坏。后来用示波器一看,发现停止位宽度不够。有些便宜的晶振精度差,波特率会漂移。建议在关键通信中使用 2 位停止位,能提高容错性。
UART 的电气特性:电平标准决定“距离”
UART 的逻辑电平标准有好几种,选错了直接烧芯片。我整理了一个对比表,方便你快速查阅:
| 电平标准 | 逻辑 1 | 逻辑 0 | 典型电压 | 传输距离 | 常见场景 |
|---|---|---|---|---|---|
| TTL | 高电平 | 低电平 | 3.3V / 5V | <1 米 | 板级通信、单片机调试 |
| RS232 | 负电平 | 正电平 | ±12V | <15 米 | 工控设备、老式电脑串口 |
| RS485 | 差分正 | 差分负 | ±5V 差分 | <1200 米 | 工业总线、传感器网络 |
嗯,这里要注意:TTL 电平的 UART 不能直接连 RS232 设备。我见过有人把 3.3V 的 TX 直接接到 RS232 的 RX 上,结果 RS232 芯片认为 3.3V 是无效电平,根本收不到数据。正确的做法是用电平转换芯片,比如 MAX232。
警告:RS485 是半双工
RS485 虽然传输距离远,但它是半双工的——同一时刻只能发或收。你需要用软件控制收发切换。我曾经在项目中忘了加切换延时,导致数据冲突,排查了整整一天。
UART 的典型应用场景
UART 的应用非常广泛,我挑三个最常见的场景说说:
- 串口调试:这是嵌入式开发者的“救命稻草”。程序跑飞了?打印日志。外设没响应?打印寄存器值。我习惯在代码里留一个 UART 调试接口,哪怕产品量产了也不关掉,方便现场排查。
- 传感器通信:很多传感器(比如 GPS、温湿度、激光测距)都通过 UART 输出数据。你只需要接三根线(TX、RX、GND),就能读到结构化的数据帧。
- 模块通信:蓝牙模块、Wi-Fi 模块、4G 模块,几乎都用 UART 和主控交互。AT 指令就是通过 UART 发送的。我记得第一次用 ESP8266 时,发了一条 AT 指令没反应,后来发现是波特率没对上。
UART 通信流程示意图
下面这张图展示了 UART 从发送到接收的完整流程,我画得比较直观:
从图上你能看到,UART 通信的核心就是三件事:帧结构、波特率、电平标准。任何一个环节出问题,通信就会失败。
我的调试习惯
拿到一块新板子,我第一件事就是用示波器看 TX 引脚的波形。确认有数据跳变,再检查波特率对不对。如果波形正常但收不到数据,十有八九是电平标准不匹配。