ESP32 WiFi.status() 始终返回 WL_DICSONNECTED (STA_MODE)

问题描述 投票:0回答:3

我花了很多时间试图解决这个问题。

我添加了多次尝试,尝试在 Wifi.begin() 之前尝试 WiFi.disconnect() 。 什么都不起作用:

status
仍然是
WL_DISCONNECTED
(0x06)。

WiFi.mode(WIFI_STA);
for(;;) {
        attempt++;

        Wifi.begin(ssid, password);
        wl_status_t status = WiFi.status();
        String m = connectionStatusMessage(status);
        log("Connection attempt %d: status is%s", attempt, m.c_str());

        if (status == WL_CONNECTED) {       
            Serial.println();
            success("connected (WL_CONNECTED)");
            information();
            break;
        } 

[更新] 注意:我使用 ESP-WROOM-32 devkit 包。 ESP32 sdk 是 PlatformIO 上可用的最新稳定版。我也测试了其他开发套件,例如来自 Az-Delivery 的开发套件。

c++ wifi esp32
3个回答
4
投票

我终于找到了解决方案:修复方法是使用

WiFi.waitForConnectResult()
而不是
WiFi.status()

我最初认为这是一个错误,但正如 @juraj 提到的,通过检查 WiFi 代码,这是等待状态到来的问题。 waitFoConnectionResult() 就是这样做的。于是就有了这样的结果。

工作代码如下:

   WiFi.mode(WIFI_STA);
   for(;;) {
        attempt++;

        Wifi.begin(ssid, password);

        // >>>> the fix <<<<<
        uint8_t status = WiFi.waitForConnectResult();

        String m = connectionStatusMessage(status);
        log("Connection attempt %d: status is%s", attempt, m.c_str());

        if (status == WL_CONNECTED) {       
            Serial.println();
            success("connected (WL_CONNECTED)");
            information();
            break;
        } 

0
投票

我有一个想法:

WiFi.begin(ssid, password)
应该只被调用一次。将其放在循环之前:

WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
        
for(;;) {
        attempt++;

        wl_status_t status = WiFi.status();
        String m = connectionStatusMessage(status);
        log("Connection attempt %d: status is%s", attempt, m.c_str());

        if (status == WL_CONNECTED) {       
            Serial.println();
            success("connected (WL_CONNECTED)");
            information();
            break;
        } 
}

0
投票

发生这种情况是因为 WiFi 连接是一个非阻塞例程,在第二个核心的后台执行。所以你的代码在完成连接之前就检查 wifi 状态。在不使用 waitForConnectResult 的情况下,这个问题的答案是告诉它自己等待:

  while (WiFi.status() != WL_CONNECTED) {
    delay(10);
  }

如果 wifi 无法连接,这将永远阻塞。您可以将其更改为自定义超时,这里是 10 秒:

  while ((WiFi.status() != WL_CONNECTED) && (millis() < 10000)) {
    delay(10);
  }

然后之后您可以再次检查wifi状态并打印它。

© www.soinside.com 2019 - 2024. All rights reserved.