在STM32上使用DMA+双缓冲接收不定长串口数据时,精准判断帧结束的关键是结合空闲中断(IDLE)和DMA传输完成中断,并合理设计缓冲切换逻辑。具体实操:1)配置DMA为循环模式,双缓冲(如Buffer1和Buffer2),使能DMA传输完成中断和USART空闲中断。2)在空闲中断中,读取当前DMA剩余数据量(DMA_GetCurrDataCounter),计算已接收字节数(缓冲区大小-剩余量),并记录当前使用的缓冲索引。3)在DMA传输完成中断中,切换缓冲(若使用双缓冲,硬件自动切换),并标记该缓冲已满,需立即处理数据。4)帧结束判断:当空闲中断触发时,说明一帧数据接收完毕(因为空闲表示总线无后续数据),此时从当前缓冲中提取数据,并确保在下一帧数据到来前处理完毕,避免覆盖。为避免丢包,建议在空闲中断中快速拷贝数据到应用层缓冲区,或将处理逻辑放到主循环,中断中仅置标志。若数据帧较长且频繁,可考虑增加缓冲深度或使用FIFO。
mcuku 阿沐 · 2026-08-27