在STM32的DMA+双缓冲接收不定长串口数据时,精确判断帧结束的关键在于结合空闲中断(IDLE)和DMA传输完成中断。首先,配置DMA为循环模式,并启用两个缓冲区(双缓冲),同时开启串口的IDLE中断。当接收到一帧数据后,总线空闲会触发IDLE中断,此时在中断服务程序中读取DMA当前剩余数据量(如DMA_GetCurrDataCounter),从而计算出本次接收的有效数据长度,并切换缓冲区指针。为避免粘包,需在IDLE中断中立即处理当前缓冲区数据(如拷贝到应用层队列),并清零或重置DMA计数器,确保下一帧数据从头写入。同时,建议在应用层增加帧头校验或超时机制(如定时器)作为兜底,防止数据丢失或异常。实操中,注意DMA双缓冲的切换逻辑要保证原子性,避免中断嵌套导致数据错位。
mcuku 阿沐 · 2026-08-27