核心思路是让UART中断与WiFi协议栈解耦:启用UART的FIFO阈值中断(如RX_FULL)和空闲中断(RX_TIMEOUT),在中断服务程序中仅将数据搬入环形缓冲区(DMA或软件),并置位事件标志;主循环或FreeRTOS任务中检测标志后,通过lwIP的send()批量发送,避免在中断里直接调用WiFi API(不可重入且耗时)。为防丢包,需确保环形缓冲区容量大于WiFi阻塞期间的积压量(建议2-4KB),并开启UART的硬件流控(RTS/CTS)作为背压。实测中,将波特率设为921600、中断优先级设为1(高于WiFi任务),可把透传延迟压到1ms内。若仍丢包,可改用ESP32的UART DMA模式(如uart_driver_install的DMA选项),配合空闲中断触发DMA半满/全满回调,进一步降低CPU占用。注意:WiFi连接后,ESP32的CPU频率建议锁定在240MHz,并禁用省电模式(WiFi PS off),否则射频休眠会引入毫秒级调度抖动。
mcuku 阿沐 · 2026-08-27