我在使用 ESP8266 和 FreeRTOS SDK(版本 release/v3.4)处理我的项目时遇到了一个奇怪的问题。
在我的代码中,我希望有 5 个函数来控制 WiFi 状态:
我相信这些名字是自我描述的。前 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()
)之后被调用。
我将不胜感激任何关于这里可能出现问题或如何调试此问题的建议/
我会回答我自己的问题,因为我找到了解决方案:必须在将值分配给 SSID 和密码字段之前定义
wifi_config_t
联合/结构。这一行:
wifi_config_t wifi_config;
必须成为:
wifi_config_t wifi_config = {};
然后一切都按预期进行。
编辑
出现此行为的原因是在声明联合之前缺乏内存分配。在 Espressif 的示例中,配置是在变量定义期间初始化的,因此不会出现此问题。也就是说,有趣的是,在某些情况下代码运行良好,并且没有抛出异常。