核心思路是把“空闲中断”当作帧边界判据,而不是数据到达判据。ESP32 上建议用 UART 硬件 FIFO + DMA 接收,配置 rx_timeout_thresh(约 2~5 个字符时间)触发接收超时中断,在中断里读取当前 DMA 已写入长度,把这段数据整体拷入环形缓冲区并记录“帧结束”标志;主任务只在看到帧结束标志后整帧取出,避免边收边解析。防半包:不要用固定长度判断,超时阈值要大于一帧内最大字符间隔(如 Modbus 3.5 字符时间),并在帧开始后启动软件定时器做二次超时兜底,超时未完成则丢弃或标记异常。防粘包:每帧处理完必须重置 DMA 描述符和接收长度,确保下一帧从新缓冲区开始;若协议带长度/帧头帧尾,优先用协议解析做二次校验。注意临界区保护长度变量,DMA 缓冲区用双缓冲或乒乓缓冲,避免拷贝期间被覆盖。