核心方案:采用DMA双缓冲(如STM32的DMA循环模式或双缓冲模式)配合空闲中断(IDLE)或超时定时器来界定帧边界。具体实操:1) 配置DMA为循环模式,使能两个缓冲区(如Buffer1/Buffer2),当DMA传输完成一半或全部时触发中断,在中断中切换处理缓冲区;2) 使用串口空闲中断(USART_IT_IDLE)检测一帧结束,在空闲中断中记录当前DMA接收位置,并立即处理已接收数据,同时重置DMA指针(如修改NDTR)避免覆盖;3) 若数据帧较长,可结合定时器超时(如10ms无新数据视为帧尾)作为备用方案。关键点:在DMA中断中,先读取DMA剩余计数(如DMA_GetCurrDataCounter)计算实际接收长度,再拷贝数据到用户缓冲区,最后清标志并重新启动DMA。注意:双缓冲切换时需确保处理速度大于接收速率,否则仍会丢帧;建议在中断中只做数据搬移,业务处理放主循环。
mcuku 阿沐 · 2026-08-27