一、UART是什么?
UART 是一种通用异步收发传输器,它是嵌入式系统中实现异步、串行、全双工通信的核心功能模块。其核心职责是完成并/串与串/并转换,并管理通信的时序与帧结构。
需要精确区分以下概念:
- UART: 指协议本身或芯片内部的逻辑功能模块。
- 串口: 常指外部的物理通信端口。
- USART:通用同步/异步收发传输器。它在UART的基础上,增加了对同步通信模式的支持。在同步模式下,通信需要一根额外的时钟线来同步数据收发。
- 通信标准: UART定义了数据链路层的帧格式和时序,而 RS-232、RS-485、TTL 定义了不同的物理层电平标准,两者结合才能构成完整的通信链路。
- 电平标准: UART模块产生的通常是TTL/CMOS电平(0V表0, 3.3V/5V表1)。而 RS-232 (+3~+15V表0, -15V ~ -3V表1)、RS-485(两线间的电压差:-(2 ~ 6)表0,+(2~6)V表1) 是用于不同应用场景的物理层电平标准,需通过专用收发器与UART模块连接。
二、怎么工作?
UART通信基于两根基本信号线:TX(发送) 和 RX(接收) 。通信双方没有共享的时钟信号,因此必须预先精确约定通信速率(波特率)。
数据帧结构
一个完整的UART数据帧由以下部分顺序构成:
- 空闲状态: 线路持续保持逻辑高电平(
1)。 - 起始位: 一个比特周期的逻辑低电平(
0)。这是帧开始的同步信号,接收端据此启动内部时钟进行位采样。 - 数据位: 紧接起始位之后,通常为 5、6、7、8 或 9 位,其中 8 位最为常见。数据以 LSB-first(最低有效位优先) 的顺序发送。
- 校验位: 可选的错误检测位。发送方根据数据位中“1”的个数计算奇偶性,接收方验证该特性。可以是奇校验、偶校验或无校验。
- 停止位: 1、1.5 或 2 位的逻辑高电平(
1)。其作用不仅是标志帧结束,更重要的是确保在下一帧起始位(下降沿)之前有一个明确的高电平到低电平的跳变,以供接收端重新同步。
工作流程
-
发送流程:
- 发送UART从数据总线接收并行数据。
- 将起始位、数据位、校验位和停止位依次添加到数据帧中。
- 按照约定的波特率,将整个帧作为串行比特流从TX引脚输出。
-
接收流程:
- 接收UART持续监测RX引脚,检测起始位的下降沿。
- 检测到下降沿后,启动内部时钟,并在每个比特周期的中间点附近进行采样(通常采样3次并按多数表决),以获得稳定的位值。
- 依次接收数据位和校验位,进行校验计算(如启用)。
- 确认收到有效的停止位。
- 丢弃帧的起止和校验位,将数据位作为并行字节提供给处理器。
三、高级特性与优化演进
现代UART模块已超越基本功能,集成了多项增强特性:
-
硬件流控:
- 通过 RTS 和 CTS 引脚实现。接收方在缓冲区将满时拉高RTS,请求发送方暂停;发送方在发送前检查CTS是否为低(表示对方就绪)。这是防止数据覆盖错误、确保大流量数据可靠传输的关键机制。
-
深度缓冲与DMA支持:
- 硬件FIFO: 内置多字节缓冲区,大幅减少CPU中断频率。
- DMA集成: 允许直接内存访问控制器接管UART数据的搬移工作,实现后台高速、大批量数据传输,极大解放CPU。
-
多设备网络扩展:
- UART本身是点对点协议。通过与 RS-485 物理层标准结合,可构建差分传输、抗干扰能力强、支持多达数百个节点的多点通信网络。这是工业现场总线(如Modbus RTU)的物理基础。
-
错误检测机制:
-
硬件UART模块通常提供状态寄存器,可直接读取以下错误标志:
- 帧错误: 未在预期位置检测到停止位。
- 奇偶校验错误: 计算的校验位与接收的不符。
- 溢出错误: 接收缓冲区已满,新数据覆盖了未读出的旧数据。
-
-
协议扩展支持: 部分UART硬件支持直接生成和解析IrDA红外编码、智能卡(ISO 7816)协议或单线半双工模式。
-
自动波特率检测: 高级模块能通过测量首个起始位宽度自动识别并匹配对方波特率。
四、局限性是什么?
- 通信距离与鲁棒性: 基本TTL电平UART通信距离短(<1米),抗共模干扰能力差。需转换为RS-232(<15米)或RS-485(>1000米)以延长距离。
- 网络拓扑: 原生不支持多主机或多从机网络,必须依赖外部硬件(如RS-485)和上层软件协议实现。比如结合RS-485物理层可轻松实现一主多从的多点网络。
- 时钟同步依赖: 完全依赖双方预设的波特率和依赖双方独立的波特率时钟。若时钟源存在误差,会在长帧或大数据量传输中累积,导致采样错位。波特率越高,对时钟精度要求越苛刻。即使初始匹配,温度漂移也可能导致长数据流中的累积位误差。需保证时钟源精度(通常误差需<2%)。
- 效率: 帧中包含起始位、停止位等开销位,有效数据负载率通常低于80%(以8N1格式为例,10位中8位为数据,效率为80%)。
- 缺乏高级协议特性: 无硬件寻址、冲突检测、自动重发等高级网络协议功能,这些均需由软件实现。
- 速率局限: 相比SPI等同步协议,速度较低,典型应用在9600 bps至3 Mbps之间。
五、边界条件/使用注意事项是什么?
在设计或调试UART系统时,必须依次确认以下层次:
| 层次 | 检查项 | 说明与常见问题 |
|---|---|---|
| 电气层 | 1. 电平标准匹配 | 确认MCU的UART引脚电平(TTL/CMOS:~3.3V/5V)与对接设备匹配。连接PC串口(RS-232:±12V)需使用MAX232等电平转换芯片。 |
| 2. 共地与参考电位 | 通信双方必须有可靠的共地连接,否则逻辑电平将失效。 | |
| 3. 波特率与时钟精度 | 双方波特率必须绝对一致。高波特率(>115200)或长距离通信时,建议使用外部晶振,确保误差 < 2-3%。 | |
| 4. 物理介质与端接 | 长距离或高速时,优先选用RS-485差分传输。在总线两端需加端接电阻(通常120Ω)以抑制信号反射。 | |
| 协议层 | 5. 帧格式一致 | 双方数据位、停止位、校验位设置必须完全相同。驱动程序必须读取并处理UART状态寄存器的错误标志位:- OE(溢出错误) : 接收数据过快,CPU未及时读取。- FE(帧错误) : 停止位校验失败(波特率失配或干扰)。- PE(奇偶校验错误) : 校验位验证失败。 |
| ------- | ------------ | --------------------------------------------- |
| 6. 流控配置 | 根据数据吞吐量和处理能力,决定是否启用硬件流控或软件流控协议。 | |
| 应用层 | 7. 缓冲区管理 | 确保软件收发缓冲区大小足够,并妥善处理溢出情况。若为低速、间歇性数据,查询或简单中断配合小缓冲区即可。若为高速、连续数据流,必须启用硬件FIFO、DMA或硬件流控,并设计充足的软件环形缓冲区。 |
| 8. 应用层协议 | 定义清晰的数据包结构(包头、地址、命令、数据、校验和),这是实现可靠通信和网络管理的基础。 |
六、应用场景是什么?
-
系统调试与日志: 作为板载日志输出接口,通过USB转串口工具连接至PC终端,是嵌入式开发最基础的调试手段。
-
模块化设备互联:
- 连接无线通信模块(蓝牙/Wi-Fi/GPRS的AT指令接口)。
- 连接卫星定位模块(GPS/北斗)。
- 连接各类智能传感器与执行器。
-
工业控制系统: 作为Modbus RTU、Profibus-DP等工业现场总线的物理层与数据链路层,广泛应用于PLC、仪表、变频器之间的通信。
-
固件升级: 通过UART实现的Bootloader,是许多设备进行固件烧录和升级的可靠途径。
-
边缘设备通信: 在路由器、服务器中作为系统控制台端口,用于初始配置和底层管理。
-
点对点数据交换: 两个微控制器之间进行简单、可靠的中低速数据交换。
七、调试指引
-
基础确认: 使用万用表或示波器测量TX/RX引脚,确认是否有波形、电平是否正确。
-
逻辑分析: 逻辑分析仪是最高效的调试工具,可直观显示比特流、精确测量波特率、解析数据帧内容。直接观察时序、帧结构和每一位的逻辑值。
-
软件调试:
- 在接收端,首先循环打印接收到的原始十六进制值,确认物理层通信正常。
- 监控UART状态寄存器,检查是否出现帧错误、溢出错误等,这是定位问题根源的关键。明确错误类型,而非盲目重试。
-
分层排查: 严格遵循“电气层 -> 协议层 -> 应用层”的顺序进行故障隔离。
-
电气层:
- 电平标准是否匹配并正确转换?
- 通信双方是否已共地?
- 波特率是否精确匹配(时钟源精度是否足够)?
- 通信距离与环境是否需要RS-485?
-
协议层:
- 数据帧格式(数据位、停止位、校验位)是否完全一致?
- 数据流是否需要硬件流控(RTS/CTS)或软件流控(XON/XOFF)?
-
驱动与应用层:
- 中断服务程序是否高效?是否可能丢失数据?
- 是否启用DMA或FIFO以优化性能?
- 上层协议是否定义了完整的报文结构(帧头、地址、长度、数据、校验和)?
- 是否处理了所有可能的硬件错误标志(OE, FE, PE)?
-
以上是个人的一些浅见,如有不当之处,欢迎批评指正。
如果觉得内容对你有启发,欢迎点赞收藏,把它变成你解决问题的 “工具箱”!
关注我,一起解锁嵌入式系统的奥秘,一起进步!