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

ESP32 WIFI_AP_STA模式调用WiFi.begin时ESP-NOW发送失败求助

ESP32 WIFI_AP_STA模式下启用WiFi连接后ESP-NOW发送端误报失败问题
  • 所用代码修改自Rui Santos的公开ESP-NOW教程
  • 实现逻辑:通过ESP-NOW协议将ESP32发送端采集的读数传输至ESP32接收端,再由接收端向ESP32网页服务器发送HTML消息;根据教程指引,需将WiFi设置为WIFI_AP_STA模式,同时支持两类WiFi连接方式
  • 本次测试所用发送端、接收端代码见下文。

测试场景与现象

场景1:接收端仅配置WIFI_AP_STA模式,不调用WiFi.begin

  • 操作:接收端设置为WIFI_AP_STA模式,注释掉WiFi.begin代码行直接运行
  • 发送端状态:发送成功
  • 接收端状态:正常接收
  • 测试结果:ESP-NOW消息从发送端到接收端传输完全正常,WIFI_STA模式下运行效果一致。

场景2:接收端配置WIFI_AP_STA模式同时调用WiFi.begin连接路由器

  • 操作:接收端设置为WIFI_AP_STA模式,取消注释WiFi.begin(WiFiSSID, WiFiPassword)代码行,连接路由器实现向网页服务器发送消息的功能
  • 发送端状态:发送失败
  • 接收端状态:发送失败场景下的接收状态
  • 测试结果:发送动作判定为失败,但接收端实际仍可正常收到数据;使用WIFI_AP模式时也会出现完全相同的故障。初步判断在WIFI_AP_STA模式下调用WiFi.begin后,接收端会向发送端返回错误的状态响应。

现象总结

  • 接收端使用WIFI_AP_STA模式但不调用WiFi.begin时,ESP-NOW端到端传输完全符合预期。
  • 接收端同时使用WIFI_AP_STA模式和WiFi.begin功能时,发送端的ESP-NOW发送动作会判定为失败;后续补充网页功能代码后,HTML消息的发送可正常运行。
  • 该故障可通过下方简化代码直接复现,当前使用的WiFi库版本为WiFi@2.0.0。
  • 已尝试多种排查思路均未解决问题,需可行的排查方向建议。

发送端代码

#include <Arduino.h>
#include <WiFi.h>
#include <esp_now.h>
uint8_t broadcastAddress[] = {0x24, 0x6F, 0x28, 0xAA, 0x84, 0x10};
typedef struct struct_message
{
  char ESP32NowText[33];
} struct_message;
struct_message ESP32NowMessage;
//
String text = "AAA000010000200003000040000500006";
esp_now_peer_info_t peerInfo;
// 数据发送回调函数
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status)
{
  Serial.print("\r\nLast Packet Send Status:\t");
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}
void setup()
{
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  if (esp_now_init() != ESP_OK)
  {
    Serial.println("Error initializing ESP-NOW");
    return;
  }
  esp_now_register_send_cb(OnDataSent);
  // 注册对等设备
  memcpy(peerInfo.peer_addr, broadcastAddress, 6);
  peerInfo.channel = 0;
  peerInfo.encrypt = false;
  // 添加对等设备
  if (esp_now_add_peer(&peerInfo) != ESP_OK)
  {
    Serial.println("Failed to add peer");
    return;
  }
}
void loop()
{
  strncpy(ESP32NowMessage.ESP32NowText, text.c_str(), text.length());
  Serial.println("Msg to send:" + String(ESP32NowMessage.ESP32NowText));
  Serial.println("Snd Len:" + String(sizeof(ESP32NowMessage)));
  // 通过ESP-NOW发送消息
  esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *)&ESP32NowMessage, sizeof(ESP32NowMessage));
  if (result == ESP_OK)
  {
    Serial.println("Sent with success");
  }
  else
  {
    Serial.println("Error sending the data");
  }
  delay(2000);
}

接收端代码

#include <Arduino.h>
#include <WiFi.h>
#include <esp_now.h>
typedef struct struct_message
{
  char ESP32NowValues[33];
} struct_message;
struct_message ESP32NowMessage;
// 数据接收回调函数
void OnDataRecv(const uint8_t *mac, const uint8_t *incomingData, int len)
{
  memcpy(&ESP32NowMessage, incomingData, sizeof(ESP32NowMessage));
  Serial.println("Bytes received: " + String(len));
  Serial.println("Values:" + String(ESP32NowMessage.ESP32NowValues));
  Serial.println("---------------------------------------");
}
const char WiFiSSID[] = "SSID";
const char WiFiPassword[] = "PASSWORD";
//
void setup()
{
  Serial.begin(115200);
  WiFi.mode(WIFI_AP_STA);
  // WiFi.begin(WiFiSSID, WiFiPassword);
  // 初始化ESP-NOW
  if (esp_now_init() != ESP_OK)
  {
    Serial.println("Error initializing ESP-NOW");
    return;
  }
  esp_now_register_recv_cb(OnDataRecv);
}
void loop()
{
}

内容的提问来源于stack exchange,提问作者ESP32Noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:39:15