4、异步通信时序:发送与接收的时序关系、采样点选择、波特率误差对通信的影响

UART异步通信的核心在于“没有独立的时钟线”,收发双方必须依靠约定的波特率(Baud Rate)和帧格式自行完成位同步与字节恢复。与SPI、I2C等同步通信不同,UART的每一位数据在时间轴上的位置完全由本地时钟决定,因此发送端与接收端的时序关系、采样点的选取策略以及波特率误差的容忍范围,直接决定了通信链路是否可靠。本章将从物理时序模型出发,深入剖析起始位检测、数据位采样、停止位判定三个关键环节,并给出工程中可量化的误差预算与调试方法。

UART异步通信时序与采样模型 发送端帧结构(8N1) START 低电平 D0 D1 D2 D3 D4 D5 D6 D7 STOP 高电平 1位时间 = 1/波特率(如 9600bps → 104.17μs) 接收端采样策略(16倍过采样) 边沿检测 采样点 每个位周期采样16次,取中间3次多数表决 起始位下降沿作为同步基准 波特率误差累积效应(10位帧) 理想位边界 实际位边界(+2%误差) 累积偏移 关键结论 • 起始位下降沿是唯一同步基准,接收端以此重置本地位计数器 • 采样点应位于位周期的50%~70%处,避开边沿跳变区域 • 波特率误差容忍度:±2%(8N1帧),超过则可能采样到错误位

4.1 异步通信的时序基础:帧结构与位同步

UART的异步特性决定了其帧结构必须包含明确的“同步标记”。一个标准的UART帧由空闲位(高电平)、起始位(低电平)、数据位(5~8位,LSB在前)、可选的奇偶校验位以及停止位(1/1.5/2位高电平)组成。发送端在空闲状态下保持TX线为高电平,当需要发送数据时,先拉低一个位时间作为起始位,接收端正是通过检测这个下降沿来建立位同步。

位同步的实质是:接收端在检测到起始位下降沿后,以本地时钟为基准,按照约定的波特率在每个位周期的特定时刻对RX线进行采样。由于收发双方使用独立的时钟源,即使标称波特率相同,实际频率也存在微小偏差。因此,接收端必须在每个位周期内选择最稳定的采样点,并容忍一定的时钟漂移。

核心原理:起始位下降沿是异步通信的“时间锚点”。接收端一旦检测到该边沿,立即启动内部位定时器,后续所有数据位的采样时刻均以此为基准累加。若发送端波特率偏快,则实际位边界会逐渐提前;若偏慢,则逐渐延后。这种累积效应在帧末端的停止位处最为明显。

4.2 采样点选择策略:过采样与多数表决

工程实践中,接收端通常采用过采样技术来提高采样可靠性。以16倍过采样为例,接收端时钟频率为波特率的16倍,每个位周期内可获取16个采样点。具体采样策略如下:

  1. 起始位检测:连续检测到低电平并确认不是毛刺(通常要求连续8个采样点为低),才判定为有效起始位。
  2. 数据位采样:在每个位周期的第7、8、9个采样点(即位周期的43.75%、50%、56.25%处)各采样一次,取多数表决结果作为该位的逻辑值。
  3. 停止位判定:在停止位周期同样采样,若采样结果为高电平则帧有效,否则产生帧错误(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停止位)时,容忍度进一步降低。

风险提示:当收发双方波特率误差方向相反时(一方偏快、一方偏慢),总误差为两者值之和。例如发送端+1.5%、接收端-1.5%,总误差达3%,已超过±2%的安全阈值,通信将出现间歇性帧错误。

4.4 实战案例:RC振荡器导致的波特率失配排查

背景与约束:某物联网节点使用STM32F103 MCU(内部RC振荡器,精度±1.5%)与蓝牙模块(外部晶振,精度±20ppm)进行UART通信,波特率设为115200bps。产品在实验室常温下工作正常,但在高低温箱中(-20℃~+70℃)出现偶发乱码。

初始现象:常温25℃时通信误码率<0.01%,但在70℃时误码率升至2.3%,且错误集中在数据帧的D5~D7位和停止位。

分析过程:

  1. 首先使用示波器测量MCU TX引脚的实际波特率:常温下实测115,300bps(误差+0.17%),70℃时实测113,800bps(误差-1.22%)。
  2. 蓝牙模块侧波特率始终为115,200bps(误差<0.01%)。
  3. 计算总误差:70℃时总误差 = |(-1.22%)| + |(+0.01%)| ≈ 1.23%,未超过±2%理论阈值。
  4. 进一步检查发现,MCU的USART外设使用16倍过采样,但采样点配置为位周期的25%(即第4个采样点),而非推荐的50%~70%。
  5. 在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 常见误区与设计总结

经验提醒:许多工程师误以为“波特率误差只要在±5%以内就能通信”,这是危险的。该结论仅适用于帧长较短(如5位数据)且采样点位于50%的理想情况。实际设计中,请遵循以下原则:
  • 优先使用外部晶振或高精度时钟源,确保总误差<±1%;
  • 若必须使用内部RC,则需在目标温度范围内实测频率漂移,并预留至少50%的采样裕量;
  • 采样点应配置在位周期50%~70%区间,避免使用默认的25%或75%;
  • 对于长帧(如9位数据+校验+2停止位),建议将总误差控制在±1.5%以内。

常见误区清单:

误区 实际后果 正确做法
认为波特率误差只影响速度不影响正确性 误差累积导致采样点偏移,最终误码 将波特率误差视为通信可靠性参数
采样点固定为位周期起点 边沿抖动和噪声导致采样错误 使用过采样并取中间点
忽略收发双方误差方向 同向误差可抵消,反向误差叠加 计算总误差时取值之和
高温/低温下不重新校准RC 温度漂移使误差超出容忍范围 做全温测试或使用温度补偿

总结而言,UART异步通信的时序设计本质上是“在不确定的时钟偏差中寻找确定的采样窗口”。起始位提供了同步基准,过采样和多数表决提供了抗干扰能力,而波特率误差预算则决定了系统的温度适应性和长期可靠性。工程师在设计串口驱动时,应将采样点配置、时钟源选型和误差预算作为整体考量,而非孤立地设置波特率寄存器。通过本章的量化分析和案例拆解,希望读者能够建立从时序原理到工程排障的完整知识链路。