串口通信基础:UART、物理标准与分层架构
一、UART 是什么
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)既是一种通信协议规范,也是集成在微控制器(MCU)内部的硬件外设。其核心职责是完成并串转换:
- 发送端:将 CPU 的并行数据转换为带帧结构的串行信号,逐位发出
- 接收端:将接收到的串行信号重新组装为并行数据,供 CPU 读取
UART 只需两根信号线——TX(发送)和 RX(接收)——即可完成全双工通信,布线比 SPI、I2C 更简洁。
二、UART 帧结构
UART 通信是异步的,不依赖专用时钟线,而是靠双方预先约定的波特率(每秒传输的 bit 数)来同步解析数据。常见波特率有 9600 bps、115200 bps 等。
一个标准 UART 数据帧由以下字段组成:
| 字段 | 长度 | 说明 |
|---|---|---|
| 起始位(Start Bit) | 1 bit | 逻辑低电平(0),通知接收端数据开始 |
| 数据位(Data Bits) | 5~9 bit | 实际传输内容,通常为 8 bit |
| 校验位(Parity Bit) | 0 或 1 bit | 可选,奇偶校验,仅能检错,不能纠错 |
| 停止位(Stop Bit) | 1~2 bit | 逻辑高电平(1),标识帧结束 |
空闲状态下 TX 引脚保持高电平。起始位将其拉低,接收端以此为触发点,按波特率逐位采样后续数据。
三、OSI 模型下的串口分层
串口通信主要覆盖 OSI 模型的物理层和数据链路层:
| OSI 层级 | 对应内容 | 职责 |
|---|---|---|
| 数据链路层 | UART 帧协议 | 成帧(起始位/数据位/校验位/停止位),解决"如何从连续电平中区分出一个字节" |
| 物理层 | RS-232 / RS-485 / TTL | 电气特性:电压标准、连接器形状、传输介质 |
UART 本身跨越这两层:逻辑上负责帧格式(数据链路层),物理上输出 TTL 电平信号(物理层的一部分)。
标准 UART 不具备网络层(IP 寻址)或传输层(端口区分)的功能。若需要,可在串口上运行 PPP/SLIP 协议赋予 IP 能力,或直接在应用层实现 Modbus RTU 等工业协议。
四、UART、SPI、I2C 的对比
三者都是 MCU 内部集成的通信外设,均工作在数据链路层与物理层,但设计哲学不同:
| 协议 | 信号线 | 时钟 | 拓扑 | 特点 |
|---|---|---|---|---|
| UART | TX, RX(2 根) | 异步(靠波特率) | 点对点 | 简单,无需时钟线,速率相对较低 |
| I2C | SDA, SCL(2 根) | 同步 | 主从(1 对多) | 节省引脚,支持多设备,协议开销较大 |
| SPI | MOSI, MISO, SCK, CS(4 根) | 同步 | 主从(1 对多) | 速度极快,全双工,占用引脚多 |
五、RS-232 与 RS-485:UART 的物理层扩展
UART 控制器输出的是 TTL 电平(0V / 3.3V),抗干扰能力弱,传输距离仅限于电路板内部(厘米级)。RS-232 和 RS-485 是在 UART 逻辑层之上,通过外接收发器芯片对物理信号进行增强的两种电气标准。
CPU 软件 (C/C++ 代码)↓ 系统总线
UART 控制器(SoC 内部) ← 处理帧格式,输出 TTL 电平
↓ TTL 电平
电平转换芯片(板载收发器)← 处理物理电压转换
↓ RS-232 / RS-485 电缆
外部设备
两种标准的核心差异:
RS-232 - 电气方式:单端信号,用 ±15V 表示逻辑 0/1 - 拓扑:点对点(1 对 1) - 传输距离:≤15 米 - 抗干扰:弱(单端信号易受共模干扰) - 典型芯片:MAX232 - 应用:早期 PC COM 口、近距离设备调试
RS-485 - 电气方式:差分信号(A、B 两线电压差表示逻辑值),外部干扰在两线上同等叠加后相互抵消 - 拓扑:总线型(1 主多从,可挂数十至上百设备),半双工 - 传输距离:≤1200 米 - 抗干扰:强 - 典型芯片:MAX485 / SP485 - 应用:工业自动化、PLC 网络、智能电表,通常配合 Modbus RTU 协议使用
RS-232 和 RS-485 在逻辑上均基于 UART 帧格式,区别仅在物理电气层。同一个 UART 引脚,接 MAX232 即为 RS-232 接口,接 MAX485 即为 RS-485 接口。
六、为何不将 RS-232/485 集成进 CPU
现代 CPU 内部工作电压约 1V,RS-232 涉及 ±12V 高压电路,集成在一起存在静电击穿风险。此外,RS-485 需要功率放大电路,占用芯片面积大,且并非所有应用都需要。独立收发器芯片提供了电气隔离保护,也保留了灵活选型的空间。
七、常见串口标准汇总
| 名称 | 层级 | 拓扑 | 速度 | 物理可靠性 | 典型应用 |
|---|---|---|---|---|---|
| RS-232 | 物理层(单端) | 点对点 | Kbps 级 | 弱 | 近距离调试、老设备通信 |
| RS-485 | 物理层(差分) | 总线型(1 对多) | Mbps 级 | 强 | 工业自动化、长距离传感器网络 |
| SPI | 数据链路层 | 主从型 | 数十 Mbps | 强(仅限板内) | 屏幕驱动、Flash 读写 |
| I2C | 数据链路层 | 主从型 | 数百 Kbps~Mbps | 强(仅限板内) | 温湿度传感器、EEPROM |
| PCIe | 系统级高速总线 | 交换机式点对点 | 数十 GB/s | 极强(硬件保证) | 显卡、NVMe 固态硬盘 |
RJ45 说明:RJ45 是物理连接器形态,不是通信协议。99% 的情况下承载以太网,但部分工业设备和网络设备(如思科路由器 Console 口)使用 RJ45 外形传输 RS-232 信号,需以设备文档为准。
八、串口可靠性机制
UART 本身只提供弱校验(奇偶校验位),实际工程中的可靠性由应用层协议补充:
1. 应用层 CRC 校验 在数据帧末尾附加 CRC16 等校验码。接收方重新计算并比对,不一致则丢弃该帧。Modbus RTU 即采用此机制。
2. ACK/NAK + 超时重传 发送方发出数据后等待接收方回复确认包(ACK)。若超时未收到,则重发,通常设定最大重试次数(如 3 次)后报错。
3. 流量控制 - 硬件流控(RTS/CTS):接收方通过拉高 CTS 线通知发送方暂停 - 软件流控(XON/XOFF):接收方通过发送特定字符控制发送节奏
九、调试实践
常用工具
- USB 转串口模块:CH340、CP2102、FT232,配合串口助手查看 MCU 日志
- 串口助手:SSCOM、XCOM、SecureCRT、MobaXterm
- 逻辑分析仪:抓取波形,验证起始位、停止位时序
Linux 下访问串口
int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY);
// 通过 termios 结构体配置波特率、数据位、停止位、流控
struct termios tty;
tcgetattr(fd, &tty);
cfsetspeed(&tty, B115200);
tcsetattr(fd, TCSANOW, &tty);
常见问题
| 现象 | 原因 | 处理方式 |
|---|---|---|
| 接收数据乱码 | 两端波特率不一致 | 确认双方波特率配置相同 |
| 串口输出卡顿主程序 | printf 默认阻塞式输出 |
改用 DMA 或环形缓冲区异步输出 |
| 中文显示乱码 | 编码不一致 | 统一使用 UTF-8 编码 |
中断中调用 printf 导致异常 |
串口是 IO 资源,影响中断响应 | 禁止在中断服务函数中直接调用 printf |
多设备场景
UART 本身是点对点通信。若需一个主机对接多个从设备,可选方案: - 使用 MCU 的多个 UART 外设(如 STM32 的 USART1、USART2) - 软串口(Software UART):用定时器和 GPIO 模拟,适用于低波特率场合 - 切换至 RS-485 总线,配合 Modbus 协议实现一主多从

浙公网安备 33010602011771号