4、异步通信时序:发送与接收的时序关系、采样点选择、波特率误差对通信的影响
UART异步通信的核心在于“没有独立的时钟线”,收发双方必须依靠约定的波特率(Baud Rate)和帧格式自行完成位同步与字节恢复。与SPI、I2C等同步通信不同,UART的每一位数据在时间轴上的位置完全由本地时钟决定,因此发送端与接收端的时序关系、采样点的选取策略以及波特率误差的容忍范围,直接决定了通信链路是否可靠。本章将从物理时序模型出发,深入剖析起始位检测、数据位采样、停止位判定三个关键环节,并给出工程中可量化的误差预算与调试方法。
4.1 异步通信的时序基础:帧结构与位同步
UART的异步特性决定了其帧结构必须包含明确的“同步标记”。一个标准的UART帧由空闲位(高电平)、起始位(低电平)、数据位(5~8位,LSB在前)、可选的奇偶校验位以及停止位(1/1.5/2位高电平)组成。发送端在空闲状态下保持TX线为高电平,当需要发送数据时,先拉低一个位时间作为起始位,接收端正是通过检测这个下降沿来建立位同步。
位同步的实质是:接收端在检测到起始位下降沿后,以本地时钟为基准,按照约定的波特率在每个位周期的特定时刻对RX线进行采样。由于收发双方使用独立的时钟源,即使标称波特率相同,实际频率也存在微小偏差。因此,接收端必须在每个位周期内选择最稳定的采样点,并容忍一定的时钟漂移。
4.2 采样点选择策略:过采样与多数表决
工程实践中,接收端通常采用过采样技术来提高采样可靠性。以16倍过采样为例,接收端时钟频率为波特率的16倍,每个位周期内可获取16个采样点。具体采样策略如下:
- 起始位检测:连续检测到低电平并确认不是毛刺(通常要求连续8个采样点为低),才判定为有效起始位。
- 数据位采样:在每个位周期的第7、8、9个采样点(即位周期的43.75%、50%、56.25%处)各采样一次,取多数表决结果作为该位的逻辑值。
- 停止位判定:在停止位周期同样采样,若采样结果为高电平则帧有效,否则产生帧错误(Frame Error)。
| 采样点位置 | 位周期百分比 | 优势 | 风险 |
|---|---|---|---|
| 位周期前25% | 0%~25% | 远离前一位边沿 | 靠近当前位边沿,易受信号上升/下降时间影响 |
| 位周期中间(推荐) | 50%~70% | 信号最稳定,远离两个边沿 | 对波特率误差的容忍度取决于具体位置 |
| 位周期后25% | 75%~100% | 接近下一位边沿前 | 波特率误差累积后可能已越过实际位边界 |
选择50%~70%区间作为采样窗口是业界共识。以9600bps为例,一个位周期约104.17μs,采样点设在52μs~73μs之间最为安全。若使用8倍过采样,则取第4、5个采样点;若使用3倍过采样(常用于低成本MCU),则取第2个采样点。
4.3 波特率误差的量化分析与容忍度计算
波特率误差是异步通信中最主要的可靠性威胁。误差来源包括:晶振初始精度(常见±20ppm~±100ppm)、温度漂移、MCU内部RC振荡器误差(可达±1%~±3%)、以及波特率分频器的取整误差。计算总误差时,需将收发双方的误差值相加。
以8N1帧(1起始位+8数据位+1停止位)为例,接收端从起始位下降沿开始计时,到第10个位(停止位)采样点共经历9.5个位周期(若采样点设在50%处)。设总波特率误差为ε,则累积时间偏移为:
累积偏移 = 9.5 × T × ε
其中 T = 1 / 波特率(标称值)
若 ε = +2%,则累积偏移 = 9.5 × 0.02 = 0.19T(约19%位周期)
若 ε = -2%,则累积偏移 = -0.19T
由于采样点位于位周期50%处,允许的最大偏移为±50%位周期(即采样点不能越过实际位边界)。因此理论最大容忍误差为:
ε_max = ±50% / 9.5 ≈ ±5.26%
但实际工程中还需考虑信号上升/下降时间、噪声毛刺、采样时钟量化误差等因素,通常将安全阈值设定为±2%。当帧长度增加(如使用9位数据+校验位+2停止位)时,容忍度进一步降低。
4.4 实战案例:RC振荡器导致的波特率失配排查
背景与约束:某物联网节点使用STM32F103 MCU(内部RC振荡器,精度±1.5%)与蓝牙模块(外部晶振,精度±20ppm)进行UART通信,波特率设为115200bps。产品在实验室常温下工作正常,但在高低温箱中(-20℃~+70℃)出现偶发乱码。
初始现象:常温25℃时通信误码率<0.01%,但在70℃时误码率升至2.3%,且错误集中在数据帧的D5~D7位和停止位。
分析过程:
- 首先使用示波器测量MCU TX引脚的实际波特率:常温下实测115,300bps(误差+0.17%),70℃时实测113,800bps(误差-1.22%)。
- 蓝牙模块侧波特率始终为115,200bps(误差<0.01%)。
- 计算总误差:70℃时总误差 = |(-1.22%)| + |(+0.01%)| ≈ 1.23%,未超过±2%理论阈值。
- 进一步检查发现,MCU的USART外设使用16倍过采样,但采样点配置为位周期的25%(即第4个采样点),而非推荐的50%~70%。
- 在25%处采样,允许的最大偏移仅为25%位周期,对应容忍误差 = 25% / 9.5 ≈ 2.63%。虽然1.23%未超限,但加上信号上升沿(约0.2μs,占位周期2.3%)和噪声影响,实际裕量已不足。
解决方案:
// 将USART采样点配置从默认改为第7个采样点(位周期43.75%)
// STM32F103 USART_CR1寄存器中OVER8=0(16倍过采样)
// 通过设置USART_BRR寄存器并调整采样点位置
USART1->CR1 |= USART_CR1_OVER8; // 保持16倍过采样
// 修改采样点:使用USART_CR2的CLKEN位和USART_GTPR寄存器
// 实际工程中推荐将采样点设为位周期50%~62.5%
结果对比:将采样点从25%调整至50%后,70℃高温下误码率降至0.02%,-20℃低温下误码率从0.5%降至0.01%。同时将MCU内部RC校准为HSI 8MHz(通过RCC_CR寄存器HSICAL校准),进一步将波特率误差控制在±0.5%以内。
复盘经验:
- 采样点位置与波特率误差容忍度是“跷跷板”关系:采样点越靠近位周期中间,容忍度越高。
- 使用内部RC振荡器时,必须考虑全温度范围内的频率漂移,不能仅以常温精度为设计依据。
- 排查乱码问题时,应先用示波器实测实际波特率,而非直接怀疑软件逻辑。
4.5 常见误区与设计总结
- 优先使用外部晶振或高精度时钟源,确保总误差<±1%;
- 若必须使用内部RC,则需在目标温度范围内实测频率漂移,并预留至少50%的采样裕量;
- 采样点应配置在位周期50%~70%区间,避免使用默认的25%或75%;
- 对于长帧(如9位数据+校验+2停止位),建议将总误差控制在±1.5%以内。
常见误区清单:
| 误区 | 实际后果 | 正确做法 |
|---|---|---|
| 认为波特率误差只影响速度不影响正确性 | 误差累积导致采样点偏移,最终误码 | 将波特率误差视为通信可靠性参数 |
| 采样点固定为位周期起点 | 边沿抖动和噪声导致采样错误 | 使用过采样并取中间点 |
| 忽略收发双方误差方向 | 同向误差可抵消,反向误差叠加 | 计算总误差时取值之和 |
| 高温/低温下不重新校准RC | 温度漂移使误差超出容忍范围 | 做全温测试或使用温度补偿 |
总结而言,UART异步通信的时序设计本质上是“在不确定的时钟偏差中寻找确定的采样窗口”。起始位提供了同步基准,过采样和多数表决提供了抗干扰能力,而波特率误差预算则决定了系统的温度适应性和长期可靠性。工程师在设计串口驱动时,应将采样点配置、时钟源选型和误差预算作为整体考量,而非孤立地设置波特率寄存器。通过本章的量化分析和案例拆解,希望读者能够建立从时序原理到工程排障的完整知识链路。