在Arduino上实现软件串口时,波特率误差主要源于定时器分频和中断延迟。首先,精确计算误差需基于CPU时钟(如16MHz)和定时器预分频值:实际波特率=时钟/(分频系数*(计数初值+1)),误差=(实际-理想)/理想*100%。建议使用Timer1的CTC模式,通过OCR1A寄存器设置精确匹配值,避免使用delayMicroseconds(其本身有误差)。优化中断响应:将接收和发送逻辑分离,接收用引脚变化中断(PCINT)检测起始位,随后在定时器中断中采样;发送则用定时器中断逐位输出。关键技巧:在中断服务程序中避免调用Serial.print等阻塞函数,使用环形缓冲区暂存数据;若误差>2%,可微调OCR1A值(如+1或-1)补偿。实测中,16MHz下115200波特率误差约0.16%,可稳定工作;但38400以下建议用Timer2(8位)配合相位修正PWM模式。最后,用逻辑分析仪验证实际波形,比理论计算更可靠。
mcuku 阿沐 · 2026-08-27