处理不定长串口帧的关键是结合DMA双缓冲与空闲中断(IDLE)或超时定时器。推荐方案:1)启用串口空闲中断(USART_IT_IDLE),当总线空闲时触发中断,此时DMA已接收完整一帧,在中断中读取DMA剩余数据量(如DMA_GetCurrDataCounter)计算实际长度,并切换缓冲区(双缓冲自动交替)。2)若需更精确的超时判断(如帧间间隔),可再启动一个硬件定时器(如TIM)作为看门狗:每次收到数据(如通过DMA传输完成中断或空闲中断)重置定时器,超时未收到新数据则判定帧结束。3)注意帧边界:若协议有固定帧头/帧尾,可在空闲中断后校验帧头,若无效则丢弃并重新同步。实操建议:在空闲中断中先关闭DMA传输,处理完数据再重新使能,避免竞争;同时确保双缓冲大小足够容纳最大帧长,防止溢出。
mcuku 阿沐 · 2026-08-27