核心思路:用DMA空闲中断(IDLE)标记帧结束,结合环形缓冲区实现无丢包接收。具体做法:1)配置DMA为循环模式,接收数据直接写入环形缓冲区;2)开启USART的IDLE中断,当总线空闲时触发中断,在中断中记录当前DMA接收位置(如读取DMA->NDTR),与上次位置比较计算出本次帧长度,并更新读索引;3)主循环或任务中从环形缓冲区按帧处理。避免丢包的关键:确保环形缓冲区大小足够(至少2倍最大帧长),且处理速度要快于接收速率;同时,在IDLE中断中仅更新索引,不进行耗时操作。若帧头固定,可在处理时校验帧头与长度字段,增强鲁棒性。注意:DMA循环模式会覆盖旧数据,若处理不及时会丢包,可考虑双缓冲或增加缓冲区深度。
mcuku 阿沐 · 2026-09-09