处理不定长串口帧的关键在于区分“字节间超时”和“帧间超时”。推荐使用DMA接收+空闲中断(IDLE)检测帧结束,同时配合定时器实现超时兜底。具体做法:1)配置DMA为循环模式,接收数据写入环形缓冲区;2)使能USART的IDLE中断,当总线空闲时(即一帧数据结束),在中断中记录当前DMA接收位置,并计算本次帧长度(当前位置减去上次帧尾位置,注意环形回绕);3)若帧间间隔较长(如RS485半双工切换),可额外启动一个基本定时器,在IDLE中断中重置定时器,若定时器溢出(如10ms)则强制认为帧结束,防止IDLE漏检。帧边界处理时,需在环形缓冲区中维护读指针和写指针,写指针由DMA更新(通过DMA_GetFlagStatus或直接读取DMA->CNDTR),读指针由协议解析代码维护。注意:DMA循环模式下,CNDTR递减,需用缓冲区大小减去CNDTR得到当前写位置。超时判断建议用硬件定时器而非软件延时,避免阻塞。最后,解析帧时先检查帧长度是否有效(如包含帧头帧尾校验),再处理数据,防止半帧。
mcuku 阿沐 · 2026-08-27