如何将WiFi信道切回1以恢复ESP-NOW通信?
解决ESP-NOW信道不匹配问题的步骤
核心原因
调用esp_wifi_disconnect()仅断开与AP的连接,WiFi模块仍会保留之前连接的AP信道(此处为11),而ESP-NOW需要工作在信道1,因此必须手动将WiFi信道切换回1。
具体实现步骤
确保断开WiFi连接
先执行标准断开操作:esp_err_t err = esp_wifi_disconnect(); if (err != ESP_OK) { ESP_LOGE("WIFI", "Disconnect failed: %s", esp_err_to_name(err)); }手动切换WiFi信道到1
断开连接后,调用esp_wifi_set_channel()强制将信道设为1,指定单信道模式即可:err = esp_wifi_set_channel(1, WIFI_SECOND_CHAN_NONE); if (err != ESP_OK) { ESP_LOGE("WIFI", "Set channel failed: %s", esp_err_to_name(err)); }WIFI_SECOND_CHAN_NONE对应20MHz带宽,适配绝大多数ESP-NOW使用场景
同步ESP-NOW对等设备配置(可选)
如果之前的对等设备信道配置因切换失效,可重新添加对等设备并明确指定信道1:esp_now_peer_info_t peer_info = {0}; memcpy(peer_info.peer_addr, PEER_MAC_ADDRESS, ESP_NOW_ETH_ALEN); peer_info.channel = 1; peer_info.encrypt = false; err = esp_now_add_peer(&peer_info); if (err != ESP_OK && err != ESP_ERR_ESPNOW_EXIST) { ESP_LOGE("ESPNOW", "Add peer failed: %s", esp_err_to_name(err)); }
完整流程示例
在你的WiFi断开函数末尾添加信道切换逻辑:
void disconnectFromMyWiFi() { ESP_LOGI("WIRELESS", "in disconnectFromMyWiFi()"); esp_err_t err = esp_wifi_disconnect(); if (err == ESP_OK) { ESP_LOGI("WIRELESS", "Wifi disconnect response: ESP_OK"); // 切换信道回1 err = esp_wifi_set_channel(1, WIFI_SECOND_CHAN_NONE); if (err != ESP_OK) { ESP_LOGE("WIRELESS", "Set channel to 1 failed: %s", esp_err_to_name(err)); } else { ESP_LOGI("WIRELESS", "Switched WiFi channel back to 1"); } } else { ESP_LOGE("WIRELESS", "Wifi disconnect failed: %s", esp_err_to_name(err)); } }
关键注意事项
- 确保所有ESP-NOW节点都统一使用信道1,否则即使本地信道切回,仍会出现信道不匹配错误。
- 如果设备以AP模式运行ESP-NOW,切换信道前需先将WiFi模式设为
WIFI_MODE_AP,再执行信道设置。
内容的提问来源于stack exchange,提问作者chrispitzer
相关产品推荐
相关产品推荐

