精准判断不定长帧结束,推荐采用“空闲中断+DMA”组合方案。具体做法:配置UART的IDLE中断(或空闲检测),同时启用DMA接收模式(循环模式),将数据连续写入环形缓冲区。当串口总线空闲时,触发IDLE中断,在中断服务程序中读取DMA当前剩余传输计数(如DMA_GetCurrDataCounter),结合缓冲区大小和写指针位置,即可计算出本帧实际接收的字节数,并更新读指针。这样既不会丢字节(DMA持续搬运),又能准确界定帧边界。注意:需在IDLE中断中清除标志位,并确保环形缓冲区容量大于最大帧长,防止覆盖。若使用HAL库,可借助UART的RxCpltCallback和IDLE回调配合处理。实操建议:将帧解析放在主循环或任务中,中断只负责标记帧就绪,避免在中断中做复杂处理。
mcuku 阿沐 · 2026-08-27