在STM32上使用DMA接收不定长串口数据时,空闲中断(IDLE)是处理不定长帧和避免丢帧的关键。首先,配置DMA为循环模式,并启用串口的IDLE中断(USART_IT_IDLE)。在IDLE中断服务函数中,读取USART->SR和USART->DR以清除IDLE标志,然后计算当前DMA接收到的数据长度(通过DMA_GetCurrDataCounter或寄存器),将数据从DMA缓冲区拷贝到应用缓冲区,并更新接收索引。为避免丢帧,需确保在IDLE中断中尽快处理数据,且DMA缓冲区大小要大于最大帧长,防止覆盖。对于粘包问题,可在每帧数据末尾添加帧尾(如0x0A)或使用帧头+长度字段,在解析时根据帧结构拆分。实操建议:使用双缓冲或环形队列存储数据,主循环中解析,避免中断中做复杂处理;同时,注意在IDLE中断中重新使能DMA接收(若使用非循环模式)。
mcuku 阿沐 · 2026-08-27