在Arduino上实现软件串口时,波特率误差主要来源于定时器分频和中断延迟。首先,精确计算误差:软件串口通常用定时器产生位周期,误差=(实际定时器周期-理想位周期)/理想位周期×100%。理想位周期=1/波特率,实际周期取决于定时器时钟源和预分频值。例如,16MHz晶振下,9600波特率,理想周期约104.17μs,若用8位定时器,分频后可能产生104μs,误差约0.16%,在可接受范围(<2%)。优化中断响应:1) 使用硬件定时器(如Timer1)而非delayMicroseconds,因为delay受中断影响;2) 在ISR中只做标志位和缓冲操作,避免耗时函数;3) 关闭全局中断期间仅保护临界区,用noInterrupts()/interrupts()包裹短代码;4) 考虑使用双缓冲或环形队列减少中断频率。实测建议:用逻辑分析仪抓取波形,对比实际位宽,微调定时器初值。若误差仍大,可改用更高精度定时器或硬件串口。
mcuku 阿沐 · 2026-08-27