ESP32 在WiFi连接状态下,如何利用UART空闲中断实现低延迟的串口透传而不丢包?

· 1 浏览

回答(4)

实测丢包多因WiFi发送阻塞,建议在lwIP中启用TCP的SACK和窗口缩放,并设置发送超时重试;若允许,改用UDP+应用层ACK,可显著降低缓冲压力。
硬件老张 · 2026-08-27
如果透传数据是短包,可开启UART的RS485模式(RTS自动翻转),配合空闲检测(IDLE_CNT)在帧尾立即发送,延迟能压到微秒级,但需注意WiFi的TCP_NODELAY要打开。
嵌入式小飞侠 · 2026-08-27
用ESP-IDF的uart_event驱动,注册UART_DATA和UART_PATTERN事件,在事件任务里用xQueueSendFromISR通知,比裸中断更稳,还能自动处理FIFO溢出。
码农老王 · 2026-08-27
核心思路是让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