NodeMCU 1.0(ESP-12E)中WiFiMulti.run致循环额外延迟7秒问题
问题原因分析
你遇到的延迟问题确实来自WiFiMulti.run()的内部实现:它会遍历你添加的所有WiFi网络,对每个未成功连接的AP执行完整的连接尝试流程,而每个尝试默认带有约7秒的超时阻塞。当你把WiFiMulti.run() != WL_CONNECTED作为while循环条件时,每次循环都会触发这个完整的重试流程,导致整个循环的周期被拉长到8秒左右(1秒计数器逻辑+7秒WiFi连接阻塞)。
解决方案
1. 改用非阻塞式调用WiFiMulti
WiFiMulti.run()支持传入一个布尔参数,当传入false时,它不会等待连接超时,而是立即返回当前的连接状态,避免长时间阻塞:
#include <ESP8266WiFi.h> #include <WiFiMulti.h> WiFiMulti wifiMulti; unsigned long lastUpdate = 0; int counter = 0; void setup() { Serial.begin(115200); wifiMulti.addAP("你的WiFi名称1", "密码1"); wifiMulti.addAP("你的WiFi名称2", "密码2"); while (WiFi.status() != WL_CONNECTED) { unsigned long now = millis(); // 每秒更新一次计数器 if (now - lastUpdate >= 1000) { lastUpdate = now; counter++; Serial.print("连接中... 已等待: "); Serial.println(counter); } // 非阻塞式检查WiFi连接状态 wifiMulti.run(false); } Serial.println("WiFi连接成功"); } void loop() { // 后续逻辑 }
2. 控制WiFiMulti的重试频率
如果你不需要每秒都尝试连接,可以降低wifiMulti.run()的调用频率,比如每5秒尝试一次,既保证连接效率,又不影响计数器更新:
unsigned long lastWifiCheck = 0; const long wifiCheckInterval = 5000; while (WiFi.status() != WL_CONNECTED) { unsigned long now = millis(); // 更新计数器 if (now - lastUpdate >= 1000) { lastUpdate = now; counter++; Serial.print("连接中... 已等待: "); Serial.println(counter); } // 每5秒尝试一次WiFi连接 if (now - lastWifiCheck >= wifiCheckInterval) { lastWifiCheck = now; wifiMulti.run(); } }
3. 理解WiFiMulti与WiFi.begin()的差异
WiFi.begin()仅针对单个AP发起连接,默认超时更短,且你可以自主控制重试时机;而WiFiMulti.run()是批量处理所有添加的AP,内置了完整的重试逻辑,这就是两种方式表现不同的核心原因。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

