You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 13:55:22