ESP8266-RTOS-SDK - 无法连接到 WPA2 网络,具体取决于 esp_wifi_init() 位置

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

我在使用 ESP8266 和 FreeRTOS SDK(版本 release/v3.4)处理我的项目时遇到了一个奇怪的问题。

在我的代码中,我希望有 5 个函数来控制 WiFi 状态:

  • wifi_初始化()
  • wifi_station_connect()
  • wifi_station_disconnect()
  • wifi_ap_start()
  • wifi_ap_stop()

我相信这些名字是自我描述的。前 2 个(仅与问题相关的代码)的(简化)代码如下:

void wifi_initialize()
{
    tcpip_adapter_init();

    esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL);
    esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL);

    wifi_init_config_t init_cfg = WIFI_INIT_CONFIG_DEFAULT(); // Problematic when called here
    ESP_ERROR_CHECK(esp_wifi_init(&init_cfg));                // Problematic when called here
    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_APSTA));      // Problematic when called here
    ESP_ERROR_CHECK(esp_wifi_start());                        // Problematic when called here
}

void wifi_station_connect()
{
    // wifi_init_config_t init_cfg = WIFI_INIT_CONFIG_DEFAULT(); // OK when called here
    // ESP_ERROR_CHECK(esp_wifi_init(&init_cfg));                // OK when called here
    // ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_APSTA));      // OK when called here
    // ESP_ERROR_CHECK(esp_wifi_start());                        // OK when called here

    wifi_config_t wifi_config;
    if (xSemaphoreTake(common_settings_mutex, pdMS_TO_TICKS(20)))
    {
        memcpy(wifi_config.sta.ssid, common_settings.wifi_ssid, 32);
        ESP_LOGI(TAG, "Using SSID: %s", wifi_config.sta.ssid);
        memcpy(wifi_config.sta.password, common_settings.wifi_password, 64);
        ESP_LOGI(TAG, "Using password: %s", wifi_config.sta.password);
        xSemaphoreGive(common_settings_mutex);
    }
    if (strlen((char*) wifi_config.sta.password))
    {
        wifi_config.sta.threshold.authmode = WIFI_AUTH_WPA2_PSK;
    }

    ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
    ESP_ERROR_CHECK(esp_wifi_connect());
}

问题:使用上述代码,ESP 无法连接到受密码保护的网络。经使用日志记录检查,复制到

wifi_config
的 SSID 和密码正确。连接到开放网络(使用空密码)工作正常。 奇怪的部分:将对
esp_wifi_init()
的调用从
wifi_initialize()
移动到
wifi_station_connect()
解决了问题,即使在任何情况下
wifi_station_connect()
都是在
wifi_initialize()
之后直接调用的(
esp_wifi_set_mode()
esp_wifi_start()
也被移动,因为他们需要在
esp_wifi_init()
)之后被调用。

我将不胜感激任何关于这里可能出现问题或如何调试此问题的建议/

c esp8266 freertos esp8266wifi
1个回答
0
投票

我会回答我自己的问题,因为我找到了解决方案:必须在将值分配给 SSID 和密码字段之前定义

wifi_config_t
联合/结构。这一行:

wifi_config_t wifi_config;

必须成为:

wifi_config_t wifi_config = {};

然后一切都按预期进行。

编辑
出现此行为的原因是在声明联合之前缺乏内存分配。在 Espressif 的示例中,配置是在变量定义期间初始化的,因此不会出现此问题。也就是说,有趣的是,在某些情况下代码运行良好,并且没有抛出异常。

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