ESP32异步WiFi扫描返回失败状态却成功,如何识别真实失败?
ESP32异步WiFi扫描出现
WIFI_SCAN_FAILED状态的原因与解决方案 一、临时WIFI_SCAN_FAILED状态的成因
这不是代码bug,而是ESP-IDF(Arduino ESP32核心基于该框架)内部扫描流程的未文档化中间状态。异步扫描启动后,底层会经历多个阶段:
- 初始化扫描参数、切换WiFi工作模式
- 启动硬件执行信道扫描
- 后台收集、整理扫描结果
在硬件扫描结束到结果整理完成的过渡阶段,系统会短暂返回-2(对应WIFI_SCAN_FAILED),这是因为此时扫描硬件已停止,但结果数据还在后台处理中,尚未生成最终的网络计数。等数据整理完成后,就会返回实际发现的网络数量。
二、区分真正扫描失败与过渡状态的方法
修改判断逻辑,通过超时机制过滤临时的-2状态,只有超时后仍返回-2才判定为真正失败:
void _scan_check() { int asyncscan = WiFi.scanNetworks(true); unsigned long timeout = millis() + 10000; // 设置10秒超时(覆盖极端扫描耗时) int status; while (millis() < timeout) { status = WiFi.scanComplete(); if (status >= 0) { Serial.printf("扫描完成,发现%d个网络\n", status); return; } else if (status == -1) { Serial.println("扫描运行中..."); } // 忽略过渡阶段的-2状态,继续等待 delay(500); } // 超时后再次确认状态 status = WiFi.scanComplete(); if (status == -2) { Serial.println("扫描真正失败"); } }
核心要点:
- 合理设置超时时间(常规WiFi扫描耗时2-5秒,10秒足够覆盖多数场景)
- 仅当超时后持续返回
-2,才判定为扫描失败 - 过渡阶段的
-2会在短时间内转为有效计数,无需处理
三、补充说明
该现象存在于全系列ESP32模块(包括ESP32-WROOM-32UE),属于底层扫描流程的正常中间状态,并非硬件或软件bug。由于Arduino ESP32核心文档未明确提及此细节,才导致开发者产生困惑。
内容的提问来源于stack exchange,提问作者Perthboy
相关产品推荐
相关产品推荐

