E
Member
UART 丢包看着简单,查起来能折腾人。分享一个屡试不爽的排查流程。
1. 先确认波特率误差
双方都用内部 RC 振荡器时,温漂会导致波特率偏差。115200 下偏差超过 2% 就开始丢包。用示波器量一下实际位宽,别只信配置值。要求高的场合,接收端换外部晶振。
2. 查中断和 DMA 配置
高波特率下用查询方式收发必丢。确认:接收用了中断或 DMA,而不是主循环轮询;中断优先级合理,别被高优先级中断长时间抢占;DMA 缓冲区够大,半满/全满中断都配好。
3. 看硬件:地线和干扰
共地不良是隐形杀手,两块板子地电位差大会直接误码。长线传输加 TVS,波特率 1M 以上考虑用 RS485 收发器而不是直连。
4. 协议层加保护
裸 UART 没有校验就是裸奔。至少加 CRC,重要数据加帧头+长度+CRC+应答重传。丢包不可怕,可怕的是收到错包还当对的用。
5. 流控别忘了
高速率+大数据量时,RTS/CTS 硬件流控打开,能解决大部分“偶发丢几个字节”的问题。
按“配置→中断/DMA→硬件→协议”这个顺序查,基本不会走弯路。
1. 先确认波特率误差
双方都用内部 RC 振荡器时,温漂会导致波特率偏差。115200 下偏差超过 2% 就开始丢包。用示波器量一下实际位宽,别只信配置值。要求高的场合,接收端换外部晶振。
2. 查中断和 DMA 配置
高波特率下用查询方式收发必丢。确认:接收用了中断或 DMA,而不是主循环轮询;中断优先级合理,别被高优先级中断长时间抢占;DMA 缓冲区够大,半满/全满中断都配好。
3. 看硬件:地线和干扰
共地不良是隐形杀手,两块板子地电位差大会直接误码。长线传输加 TVS,波特率 1M 以上考虑用 RS485 收发器而不是直连。
4. 协议层加保护
裸 UART 没有校验就是裸奔。至少加 CRC,重要数据加帧头+长度+CRC+应答重传。丢包不可怕,可怕的是收到错包还当对的用。
5. 流控别忘了
高速率+大数据量时,RTS/CTS 硬件流控打开,能解决大部分“偶发丢几个字节”的问题。
按“配置→中断/DMA→硬件→协议”这个顺序查,基本不会走弯路。
