乐鑫技术交流
直播中

郭大

11年用户 1059经验值
擅长:嵌入式技术
私信 关注
[问答]

esp-now通信不成功的原因?怎么解决?

我基本都没有改,只是改了mac地址。打印出来错误为:Peer interface is invalid和Failed to add peer不懂是什么原因。是接受方哪个地方设置的不正确吗。以下是我发送端和接收端的程序,不忙的大神可以帮忙看看哪里出了问题。

以下为发送端的程序Code: Select all
// Own macAddress:98:F4:AB:3A:77:0C// recver MAC Address: 98:F4:AB:39:4C:C0#include #include // REPLACE WITH YOUR RECEIVER MAC Addressuint8_t broadcastAddress[] = {0x98, 0xF4, 0xAB, 0x39, 0x4C, 0xC0};// Structure example to send datatypedef struct struct_message {  char a[32];  int b;  float c;  String d;  bool e;} struct_message;// Create a struct_message called myDatastruct_message myData;// callback when data is sentvoid OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {  Serial.print("rnLast Packet Send Status:t");  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");} void setup() {  // Init Serial Monitor  Serial.begin(115200);   // Set device as a Wi-Fi Station  WiFi.mode(WIFI_STA);  Serial.println(WiFi.macAddress());  // Init ESP-NOW  if (esp_now_init() != ESP_OK) {    Serial.println("Error initializing ESP-NOW");    return;  }  // Once ESPNow is successfully Init, we will register for Send CB to  // get the status of Trasnmitted packet  esp_now_register_send_cb(OnDataSent);    // Register peer  esp_now_peer_info_t peerInfo;  memcpy(peerInfo.peer_addr, broadcastAddress, 6);  peerInfo.channel = 0;    peerInfo.encrypt = false;    // Add peer          if (esp_now_add_peer(&peerInfo) != ESP_OK){    Serial.println("Failed to add peer");    return;  }} void loop() {  // Set values to send  strcpy(myData.a, "THIS IS A CHAR");  myData.b = random(1,20);  myData.c = 1.2;  myData.d = "Hello";  myData.e = false;  // Send message via ESP-NOW  esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));     if (result == ESP_OK) {    Serial.println("Sent with success");  }  else {    Serial.println("Error sending the data");    Serial.print("error code is : ");    Serial.println(result);  }  delay(2000);}
--------------------------------------------------------------------------------------------------------------------------------
以下为接受端的程序。Code: Select all
// send board MAC Address:98:F4:AB:3A:77:0C// Recv board MAC Address: 98:F4:AB:39:4C:C0#include #include // Structure example to receive datatypedef struct struct_message {  char a[32];  int b;  float c;  String d;  bool e;} struct_message;// Create a struct_message called myDatastruct_message myData;// callback function that will be executed when data is receivedvoid OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {  memcpy(&myData, incomingData, sizeof(myData));  Serial.print("Bytes received: ");  Serial.println(len);  Serial.print("Char: ");  Serial.println(myData.a);  Serial.print("Int: ");  Serial.println(myData.b);  Serial.print("Float: ");  Serial.println(myData.c);  Serial.print("String: ");  Serial.println(myData.d);  Serial.print("Bool: ");  Serial.println(myData.e);  Serial.println();}void setup() {  // Initialize Serial Monitor  Serial.begin(115200);  // Set device as a Wi-Fi Station  WiFi.mode(WIFI_STA);  Serial.println(WiFi.macAddress());  // Init ESP-NOW  if (esp_now_init() != ESP_OK) {    Serial.println("Error initializing ESP-NOW");    return;  }  // Once ESPNow is successfully Init, we will register for recv CB to  // get recv packer info  esp_now_register_recv_cb(OnDataRecv);}void loop() {  }

回帖(2)

肖锋

2024-6-5 10:11:26
推测是不是esp-now需要指定ifidx这个参数,
wifi_interface_t ifidx:说明如下
Wi-Fi interface that peer uses to send/receive ESPNOW data
程序中是没有指定这个参数的,所以参考文档,指定了这个参数,在 peer information里面加了一句:
peerInfo.ifidx = WIFI_IF_STA;
最后测试成功了。
举报

杨海清

2024-6-5 16:03:02
根据您提供的信息,您在ESP-NOW通信中遇到了一些问题,错误信息为:“Peer interface is invalid”和“Failed to add peer”。这些问题可能是由于以下几个原因导致的:

1. MAC地址格式错误:请确保您输入的MAC地址格式正确,每个字节之间用冒号(:)分隔。

2. 接收方未初始化ESP-NOW:请确保接收方设备已经初始化了ESP-NOW,并注册了回调函数。

3. 发送方未添加接收方为peer:在使用ESP-NOW发送数据之前,需要将接收方的MAC地址添加为peer。请确保您已经正确添加了接收方的MAC地址。

4. 通道不一致:请确保发送方和接收方使用的是相同的通道(channel)。

为了解决这些问题,请尝试以下步骤:

1. 检查MAC地址格式:确保发送端和接收端的MAC地址格式正确,每个字节之间用冒号(:)分隔。

2. 初始化ESP-NOW:在接收方设备上,确保已经初始化了ESP-NOW并注册了回调函数。例如:

```c
esp_now_init();
esp_now_register_recv_cb(esp_now_recv_cb);
```

3. 添加接收方为peer:在发送方设备上,确保已经将接收方的MAC地址添加为peer。例如:

```c
esp_err_t add_peer(const uint8_t *mac_addr, const uint8_t *peer_key, const uint8_t channel, const uint8_t *interface) {
    esp_now_peer_info_t peer_info;
    memset(&peer_info, 0, sizeof(peer_info));
    memcpy(peer_info.peer_addr, mac_addr, 6);
    memcpy(peer_info.encrypt_key, peer_key, 16);
    peer_info.channel = channel;
    peer_info.interface = interface;

    return esp_now_add_peer(&peer_info);
}
```

4. 确保通道一致:在发送方和接收方设备上,确保使用的是相同的通道。例如:

```c
#define CHANNEL 1
```

5. 检查回调函数:确保您已经正确实现了回调函数,以便在接收到数据时进行处理。

尝试以上步骤后,如果问题仍然存在,请检查您的代码以确保没有其他错误。希望这些建议能帮助您解决问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分