4、串行通信基础:同步与异步、波特率、数据帧格式、奇偶校验、流控制
串行通信是嵌入式系统中最基础、应用最广泛的通信方式之一。无论是调试用的 UART、板级总线 SPI/I2C,还是高速接口 USB/PCIe,其底层都遵循串行数据传输的基本规则。理解同步与异步的差异、波特率的计算、数据帧的封装、奇偶校验的局限以及流控制的必要性,是设计可靠通信链路的前提。本章将从工程实践角度,系统拆解串行通信的五大核心要素,并结合典型场景给出可落地的设计建议。
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、蓝牙模块 |
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% ✓
操作流程:配置波特率时,应遵循以下步骤:
- 确认系统时钟频率(如 72MHz、84MHz、100MHz)。
- 计算分频系数并取整,注意四舍五入。
- 反算实际波特率,验证误差是否在 ±2% 内。
- 若误差超限,尝试调整系统时钟或选择相近的标准波特率。
4.3 数据帧格式:起始位、数据位、停止位的约定
核心原理:UART 数据帧是异步通信的最小传输单元,典型帧结构为:1 位起始位(低电平) + 5~8 位数据位(LSB 优先) + 可选奇偶校验位 + 1~2 位停止位(高电平)。起始位的下降沿用于触发接收端采样定时器,停止位保证帧间有明确的空闲电平(高电平)。
帧格式参数:
- 数据位:通常为 8 位(一个字节),也可配置为 7 位(用于 ASCII 码)。
- 停止位:1 位或 2 位。2 位停止位用于慢速设备或高噪声环境,增加帧间隔。
- 空闲电平:无数据传输时,TX 线保持高电平。
- LSB 优先:先发送最低有效位,后发送最高有效位。
案例拆解:调试串口通信异常
某嵌入式设备通过 UART 与 PC 通信,PC 端显示乱码。排查过程如下:
- 初始现象:PC 串口助手接收数据为乱码,但设备端发送逻辑正常。
- 关键参数检查:设备配置为 115200-8-N-1(8 数据位、无校验、1 停止位),PC 端配置为 9600-8-N-1。波特率不一致导致采样错位。
- 分析判断:将 PC 端波特率改为 115200 后,乱码消失,确认是波特率不匹配。
- 进一步验证:使用示波器测量 TX 引脚,观察帧波形,确认起始位低电平宽度为 8.68μs(对应 115200),与配置一致。
- 复盘经验:调试串口前,务必先确认两端波特率、数据位、停止位完全一致;使用示波器或逻辑分析仪可快速定位帧格式问题。
4.4 奇偶校验:简单的检错机制
核心原理:奇偶校验是一种简单的错误检测方法。发送端根据数据位中“1”的个数,计算校验位:偶校验使数据位+校验位中“1”的总数为偶数;奇校验则为奇数。接收端重新计算并比对,若不一致则报告校验错误。
局限性分析:
- 只能检测奇数个位翻转(如 1 位、3 位错误),无法检测偶数个位翻转。
- 无法定位错误位置,也无法纠正错误。
- 对于噪声干扰严重的工业环境,误检率较高。
工程建议:
- 对可靠性要求高的场景(如固件升级),应使用 CRC 校验(如 CRC-16/CRC-32)替代奇偶校验。
- 奇偶校验仅适用于低速、短距离、低噪声的通信链路。
- 在 UART 调试中,通常禁用校验位(N),以简化帧格式。
4.5 流控制:防止数据溢出
核心原理:流控制用于协调收发双方的速率,防止接收端缓冲区溢出。分为硬件流控制和软件流控制两种。
硬件流控制(RTS/CTS):
- 使用 RTS(请求发送)和 CTS(清除发送)两根专用信号线。
- 接收端缓冲区快满时,拉低 RTS 通知发送端暂停;缓冲区空闲后拉高 RTS 恢复发送。
- 适用于高速通信(如 115200 以上)或大数据量传输。
软件流控制(XON/XOFF):
- 使用特殊字符 XOFF(0x13)和 XON(0x11)进行控制。
- 接收端发送 XOFF 暂停发送,发送 XON 恢复。
- 缺点:不能用于二进制数据(可能误判),且响应延迟较大。
操作流程(硬件流控制配置):
- 确认 MCU 的 UART 外设支持 RTS/CTS 功能(如 STM32 的 USART 硬件流控制)。
- 连接 RTS 到对端 CTS,CTS 到对端 RTS,交叉连接。
- 在代码中使能硬件流控制模式,并设置合适的 FIFO 阈值。
- 测试不同数据量下的丢包率,调整阈值。
4.6 综合设计建议与复盘
串行通信参数配置清单:
| 参数 | 推荐值 | 适用场景 |
|---|---|---|
| 波特率 | 115200 | 调试、常规传感器 |
| 数据位 | 8 | 二进制数据 |
| 校验位 | 无(N) | 短距离、低噪声 |
| 停止位 | 1 | 标准配置 |
| 流控制 | 硬件 RTS/CTS | 高速或大数据量 |
总结复盘:串行通信的可靠性建立在“收发双方完全一致的参数约定”之上。任何一项参数不匹配(波特率、帧格式、校验方式)都会导致通信失败。在实际项目中,建议遵循以下原则:
- 先验证物理层:用示波器确认 TX/RX 波形幅值、边沿质量。
- 再验证协议层:使用逻辑分析仪解析帧格式,确认起始位、数据位、停止位时序。
- 最后验证应用层:通过回环测试(TX 接 RX)验证收发路径。
- 保留调试接口:在 PCB 上预留串口测试点,便于产线测试和现场排障。