串口通信基础: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 协议实现一主多从

posted @ 2026-04-21 11:16  noonafter  阅读(148)  评论(0)    收藏  举报