在DMA+双缓冲接收不定长数据时,区分帧尾与数据中的0x0D 0x0A,核心是引入“帧协议”而非依赖裸字节匹配。建议采用“帧头+长度+数据+校验+帧尾”结构,例如帧头0xAA 0x55,长度字段(2字节)明确数据长度,帧尾固定0x0D 0x0A。接收时,DMA将数据存入双缓冲,在空闲中断(IDLE)或半满/全满中断中解析:先扫描帧头,读取长度,再按长度提取数据,最后校验帧尾。若数据中恰好出现0x0D 0x0A,因长度字段已限定范围,不会误判。实操中,可启用串口空闲中断(HAL_UARTEx_ReceiveToIdle_DMA)配合双缓冲,在回调中处理完整帧。注意:帧尾仅作为校验,不用于定界;若必须仅靠帧尾,则需转义(如0x0D 0x0A前加0x1B),但更推荐带长度的协议,简单可靠。
mcuku 阿沐 · 2026-08-27