写一段 Esp-Now 组网双向通信的代码
时间: 2023-12-01 11:37:50 浏览: 129
Socket双向通信基础代码
5星 · 资源好评率100%
当然可以!以下是一个示例的ESP-Now组网双向通信的代码:
```
#include <esp_now.h>
#include <WiFi.h>
#define CHANNEL 1
#define MAX_PEERS 20
typedef struct {
uint8_t macAddr[6];
} __attribute__((packed)) peerInfo;
// 函数声明
void onDataRecv(const uint8_t *macAddr, const uint8_t *data, int dataLen);
void sendMsg(const uint8_t *peerMac, const uint8_t *data, int dataLen);
void setup() {
Serial.begin(115200);
// 初始化ESP-NOW
if (esp_now_init() != ESP_OK) {
Serial.println("ESP-NOW 初始化失败");
return;
}
// 注册回调函数来接收数据
esp_now_register_recv_cb(onDataRecv);
// 设置为组网模式
if (esp_now_set_self_role(ESP_NOW_ROLE_COMBO) != ESP_OK) {
Serial.println("设置组网模式失败");
return;
}
// 添加对等节点
WiFi.mode(WIFI_STA);
if (esp_now_add_peer(NULL, ESP_NOW_ROLE_COMBO, CHANNEL, NULL, 0) != ESP_OK) {
Serial.println("添加对等节点失败");
return;
}
Serial.println("ESP-NOW 组网双向通信已准备就绪");
}
void loop() {
// 发送消息到对等节点
sendMsg(NULL, "Hello from Node 1", 17);
delay(1000);
}
// 接收到数据的回调函数
void onDataRecv(const uint8_t *macAddr, const uint8_t *data, int dataLen) {
Serial.println("收到消息:");
Serial.write(data, dataLen);
Serial.println();
}
// 发送消息到对等节点
void sendMsg(const uint8_t *peerMac, const uint8_t *data, int dataLen) {
esp_now_send(peerMac, data, dataLen);
}
```
这是一个简单的示例,其中节点1发送消息到对等节点,并且对等节点收到消息后会打印出来。你可以根据自己的需求进行修改和扩展。
阅读全文