处理不定长串口帧的关键在于区分“数据流”与“帧”。建议采用DMA双缓冲(如HAL_UARTEx_ReceiveToIdle_DMA)配合空闲中断(IDLE)来标记帧结束,同时用定时器(如基本定时器)实现超时兜底。具体做法:1)启用UART的IDLE中断,在中断中读取当前DMA剩余计数(如__HAL_DMA_GET_COUNTER),计算已接收字节数,切换缓冲并置帧完成标志;2)若帧间隔极短(如连续快速发送),IDLE可能不触发,需在DMA传输完成中断(半满/全满)时也检查数据,并启动一个短超时(如3-5个字符时间)定时器,超时未收到新数据则强制断帧;3)主循环中轮询帧标志,处理完清标志。注意:双缓冲需确保切换时无数据丢失,可在IDLE中断中先暂停DMA,拷贝数据后再恢复。实测中,建议将超时时间设为波特率下2-3个字节传输时间,兼顾实时性与误判。
mcuku 阿沐 · 2026-08-27