4、串行通信基础:同步与异步、波特率、数据帧格式、奇偶校验、流控制

串行通信是嵌入式系统中最基础、应用最广泛的通信方式之一。无论是调试用的 UART、板级总线 SPI/I2C,还是高速接口 USB/PCIe,其底层都遵循串行数据传输的基本规则。理解同步与异步的差异、波特率的计算、数据帧的封装、奇偶校验的局限以及流控制的必要性,是设计可靠通信链路的前提。本章将从工程实践角度,系统拆解串行通信的五大核心要素,并结合典型场景给出可落地的设计建议。

串行通信核心要素关系图 串行通信 同步 / 异步 波特率 数据帧格式 奇偶校验 流控制 时钟线 / 无时钟线 SPI / I2C vs UART 位/秒 (bps) 误差 < 2% 起始位 + 数据位 + 停止位 LSB 优先 偶校验 / 奇校验 仅检错,不纠错 硬件 RTS/CTS 软件 XON/XOFF 工程要点 ① 异步通信必须约定完全一致的帧格式与波特率 ② 校验位只能检测奇数位翻转,无法纠正错误

4.1 同步通信与异步通信:时钟的角色差异

核心原理:同步通信与异步通信的本质区别在于时钟信号的传递方式。同步通信(如 SPI、I2C)由主机主动产生时钟信号,并通过专用时钟线(SCLK、SCL)发送给从机,数据线在时钟边沿被采样,收发双方严格同步。异步通信(如 UART)则没有独立的时钟线,收发双方各自使用本地时钟(通常由晶振分频产生),通过约定相同的波特率来近似同步,并在每个字节前添加起始位来重新对齐时钟相位。

判断方法:在设计接口选型时,可通过以下维度快速判断:

  • 时钟线:有专用时钟线则为同步,无则为异步。
  • 数据线数量:同步通信通常至少 2 根(时钟+数据),异步只需 1 根数据线(半双工)或 2 根(全双工)。
  • 传输效率:同步通信因无需起始位/停止位,有效数据率更高;异步通信每字节有 2-3 位额外开销。
  • 抗干扰能力:同步通信对时钟抖动敏感,但抗噪声能力较强;异步通信对波特率误差敏感,误差超过 ±2% 即可能产生采样错误。
对比维度 同步通信(SPI/I2C) 异步通信(UART)
时钟来源 主机主动产生,经时钟线传输 各设备本地时钟,无时钟线
帧开销 无起始/停止位,开销小 每字节 2-3 位开销
典型速率 SPI 可达 10-100 Mbps 通常 9600-921600 bps
连接复杂度 至少 3 根线(SPI)或 2 根(I2C) 1-2 根数据线
典型应用 Flash、传感器、显示屏 调试口、GPS、蓝牙模块
经验提醒:在 MCU 与 PC 通信时,USB 转串口芯片(如 CH340、CP2102)内部已处理了 USB 与 UART 的协议转换,但波特率误差仍由两端晶振精度决定。建议使用 12MHz 或 16MHz 晶振,避免使用 11.0592MHz 以外的非标准频率导致分频误差。

4.2 波特率:通信速率的精确约定

核心原理:波特率(Baud Rate)表示每秒传输的符号数,在 UART 中每个符号即一个比特,因此波特率等于比特率(bps)。波特率由发送端和接收端各自独立产生,必须预先约定一致。常用波特率有 9600、19200、38400、115200 等,其中 115200 是当前最常用的调试速率。

误差计算与容限:波特率误差来源于晶振精度和分频器舍入。设系统时钟频率为 Fclk,目标波特率为 B,则分频系数 D = Fclk / (16 × B)(以 16 倍过采样为例)。实际波特率 B_actual = Fclk / (16 × D),误差 E = |B_actual - B| / B × 100%。接收端要求误差小于 ±2%,否则采样点会逐渐偏移,最终导致帧错误。

// 以 STM32 为例,计算 USART 分频值
// 假设 Fclk = 72MHz,目标波特率 115200
uint16_t usart_div = (uint16_t)(72000000 / (16 * 115200)); // = 39
// 实际波特率 = 72000000 / (16 * 39) = 115384.6
// 误差 = (115384.6 - 115200) / 115200 = 0.16% < 2% ✓

操作流程:配置波特率时,应遵循以下步骤:

  1. 确认系统时钟频率(如 72MHz、84MHz、100MHz)。
  2. 计算分频系数并取整,注意四舍五入。
  3. 反算实际波特率,验证误差是否在 ±2% 内。
  4. 若误差超限,尝试调整系统时钟或选择相近的标准波特率。
风险提示:当使用外部有源晶振(如 25MHz)时,分频系数可能无法整除,导致误差偏大。例如 25MHz 下产生 115200 波特率,分频系数为 13.57,取整后误差达 4.2%,通信将不稳定。此时应改用 24MHz 或 12MHz 晶振,或使用支持小数分频的 MCU(如 STM32F4 系列)。

4.3 数据帧格式:起始位、数据位、停止位的约定

核心原理:UART 数据帧是异步通信的最小传输单元,典型帧结构为:1 位起始位(低电平) + 5~8 位数据位(LSB 优先) + 可选奇偶校验位 + 1~2 位停止位(高电平)。起始位的下降沿用于触发接收端采样定时器,停止位保证帧间有明确的空闲电平(高电平)。

帧格式参数:

  • 数据位:通常为 8 位(一个字节),也可配置为 7 位(用于 ASCII 码)。
  • 停止位:1 位或 2 位。2 位停止位用于慢速设备或高噪声环境,增加帧间隔。
  • 空闲电平:无数据传输时,TX 线保持高电平。
  • LSB 优先:先发送最低有效位,后发送最高有效位。

案例拆解:调试串口通信异常

某嵌入式设备通过 UART 与 PC 通信,PC 端显示乱码。排查过程如下:

  1. 初始现象:PC 串口助手接收数据为乱码,但设备端发送逻辑正常。
  2. 关键参数检查:设备配置为 115200-8-N-1(8 数据位、无校验、1 停止位),PC 端配置为 9600-8-N-1。波特率不一致导致采样错位。
  3. 分析判断:将 PC 端波特率改为 115200 后,乱码消失,确认是波特率不匹配。
  4. 进一步验证:使用示波器测量 TX 引脚,观察帧波形,确认起始位低电平宽度为 8.68μs(对应 115200),与配置一致。
  5. 复盘经验:调试串口前,务必先确认两端波特率、数据位、停止位完全一致;使用示波器或逻辑分析仪可快速定位帧格式问题。

4.4 奇偶校验:简单的检错机制

核心原理:奇偶校验是一种简单的错误检测方法。发送端根据数据位中“1”的个数,计算校验位:偶校验使数据位+校验位中“1”的总数为偶数;奇校验则为奇数。接收端重新计算并比对,若不一致则报告校验错误。

局限性分析:

  • 只能检测奇数个位翻转(如 1 位、3 位错误),无法检测偶数个位翻转。
  • 无法定位错误位置,也无法纠正错误。
  • 对于噪声干扰严重的工业环境,误检率较高。

工程建议:

  • 对可靠性要求高的场景(如固件升级),应使用 CRC 校验(如 CRC-16/CRC-32)替代奇偶校验。
  • 奇偶校验仅适用于低速、短距离、低噪声的通信链路。
  • 在 UART 调试中,通常禁用校验位(N),以简化帧格式。
实战对比:某传感器模块支持 8N1 和 8E1 两种模式。在 10 米屏蔽双绞线、工业电机干扰环境下,8N1 模式误码率约 0.5%,8E1 模式误码率降至 0.1%。但启用校验后,有效数据吞吐量下降约 11%(每字节多 1 位)。若应用对实时性要求高,可考虑关闭校验并增加 CRC 应用层校验。

4.5 流控制:防止数据溢出

核心原理:流控制用于协调收发双方的速率,防止接收端缓冲区溢出。分为硬件流控制和软件流控制两种。

硬件流控制(RTS/CTS):

  • 使用 RTS(请求发送)和 CTS(清除发送)两根专用信号线。
  • 接收端缓冲区快满时,拉低 RTS 通知发送端暂停;缓冲区空闲后拉高 RTS 恢复发送。
  • 适用于高速通信(如 115200 以上)或大数据量传输。

软件流控制(XON/XOFF):

  • 使用特殊字符 XOFF(0x13)和 XON(0x11)进行控制。
  • 接收端发送 XOFF 暂停发送,发送 XON 恢复。
  • 缺点:不能用于二进制数据(可能误判),且响应延迟较大。

操作流程(硬件流控制配置):

  1. 确认 MCU 的 UART 外设支持 RTS/CTS 功能(如 STM32 的 USART 硬件流控制)。
  2. 连接 RTS 到对端 CTS,CTS 到对端 RTS,交叉连接。
  3. 在代码中使能硬件流控制模式,并设置合适的 FIFO 阈值。
  4. 测试不同数据量下的丢包率,调整阈值。
常见误区:许多开发者误以为流控制是“可选项”,在高速通信中省略。实际上,当发送端持续以 1Mbps 速率发送,而接收端中断处理不及时,缓冲区溢出将导致不可恢复的数据丢失。建议在以下场景强制启用流控制:① 波特率 ≥ 460800;② 接收端使用 DMA 且缓冲区有限;③ 通信链路经过蓝牙或无线模块(缓冲延迟不确定)。

4.6 综合设计建议与复盘

串行通信参数配置清单:

参数 推荐值 适用场景
波特率 115200 调试、常规传感器
数据位 8 二进制数据
校验位 无(N) 短距离、低噪声
停止位 1 标准配置
流控制 硬件 RTS/CTS 高速或大数据量

总结复盘:串行通信的可靠性建立在“收发双方完全一致的参数约定”之上。任何一项参数不匹配(波特率、帧格式、校验方式)都会导致通信失败。在实际项目中,建议遵循以下原则:

  • 先验证物理层:用示波器确认 TX/RX 波形幅值、边沿质量。
  • 再验证协议层:使用逻辑分析仪解析帧格式,确认起始位、数据位、停止位时序。
  • 最后验证应用层:通过回环测试(TX 接 RX)验证收发路径。
  • 保留调试接口:在 PCB 上预留串口测试点,便于产线测试和现场排障。