光
最近调一个 STM32 串口接收项目,波特率 115200,数据一密就丢字节,查了一圈,问题基本都出在接收路径的设计上,分享一下排查顺序。一、先确认是不是中断来不及。串口每字节进一次中断,高波特率下主循环稍有阻塞就会溢出。先看 ORE 标志有没有置位,有就说明接收寄存器没及时搬走,这是最常见的丢字节原因。二、DMA + 空闲中断是正解。DMA 搬运不占 CPU,空闲中断判断一帧结束。注意两点:DMA 要配循环模式,缓冲区用环形结构;空闲中断里先清标志再读 DMA 剩余计数,算出本帧长度,否则容易多算或少算一帧。三、环形缓冲的读写指针要防竞态。写指针在中断里推进,读指针在主循环里推进,判满判空别用相等,要留一个空位或者用计数器,否则满和空分不清,数据会被悄悄覆盖。四、别忽视时钟和波特率误差。内外时钟偏差超过 2%,长帧必出错,先用示波器量实际波特率,再怀疑软件。五、DMA 半传输中断别滥用。半传输适合双缓冲 ping-pong,单缓冲用它反而容易把一帧拆成两段,解析层要能处理分段。你平时串口接收用 DMA + 空闲中断,还是中断逐字节?遇到过哪些更隐蔽的丢字节原因?

