ESP32开发板单向点对点ESP-NOW无线通信

简介

本例程通过两个ESP32开发板实现单向点对点ESP-NOW无线通信,一个ESP32开发板作为Sender发送方,另一个开发板作为Receiver接收方接收发送方的数据。

读取ESP32接收方Receiver的MAC地址

javascript 复制代码
#include <WiFi.h>
#include <esp_wifi.h>

void readMacAddress(){
  uint8_t baseMac[6];
  esp_err_t ret = esp_wifi_get_mac(WIFI_IF_STA, baseMac);
  if (ret == ESP_OK) {
    Serial.printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
                  baseMac[0], baseMac[1], baseMac[2],
                  baseMac[3], baseMac[4], baseMac[5]);
  } else {
    Serial.println("Failed to read MAC address");
  }
}

void setup(){
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin();
  Serial.print("[DEFAULT] ESP32 Board MAC Address: ");
  readMacAddress();
}
 
void loop(){

}

ESP32发送方Sender程序

把接收方ESP32开发板读取到的MAC地址填入以下程序第4行中

javascript 复制代码
#include <esp_now.h>
#include <WiFi.h>

// REPLACE WITH YOUR RECEIVER MAC Address
uint8_t broadcastAddress[] = {0x54, 0x43, 0xb2, 0x7f, 0x00, 0x60};

// Structure example to send data
// Must match the receiver structure
typedef struct struct_message {
  char a[32];
  int b;
  float c;
  bool d;
} struct_message;

// Create a struct_message called myData
struct_message myData;
esp_now_peer_info_t peerInfo;

// callback when data is sent
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() {
  // Init Serial Monitor
  Serial.begin(115200); 
  // Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);
  // 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
  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 = 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");
  }
  delay(2000);
}

ESP32接收方Receiver程序

javascript 复制代码
#include <esp_now.h>
#include <WiFi.h>

// Structure example to receive data
// Must match the sender structure
typedef struct struct_message {
    char a[32];
    int b;
    float c;
    bool d;
} struct_message;

// Create a struct_message called myData
struct_message myData;

// callback function that will be executed when data is received
void 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("Bool: ");
  Serial.println(myData.d);
  Serial.println();
}
 
void setup() {
  // Initialize Serial Monitor
  Serial.begin(115200);
  
  // Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);

  // 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(esp_now_recv_cb_t(OnDataRecv));
}
 
void loop() {

}

ESP-NOW通信验证

上传发送方和接收方的程序到ESP32开发板,打开两个串口助手分别显示发送方和接收方的打印结果情况 ESP32发送方:发送结构体struct_message数据并显示发送成功

ESP32接收方:显示接收到的发送方发送的结构体struct_message的具体数据

总结

通过以上例程验证了ESP32开发板之间单向点对点的ESP-NOW无线通信,接下来的篇章将继续验证多个的ESP32开发板之间实现一对多的ESP-NOW无线通信。

相关推荐
进击的横打2 小时前
【车载开发系列】RH850中的看门狗WDTA
单片机·嵌入式硬件
没有医保李先生2 小时前
可变参函数底层解析
开发语言·stm32·单片机
v先v关v住v获v取2 小时前
ZG-6右箱体双面钻专用机床右主轴箱设计1张总装图+零件图cad+设计说明书
科技·单片机·51单片机
GodKK老神灭2 小时前
SWD协议中BANK机制详解
单片机·keil
逆小舟3 小时前
【SWM320】学习使用UART
单片机·学习·嵌入式软件
逐步前行3 小时前
STM32_SysTick_系统定时器
stm32·单片机·嵌入式硬件
逐步前行4 小时前
STM32_外部中断_寄存器操作
stm32·单片机·嵌入式硬件
安庆平.Я4 小时前
STM32——FreeRTOS - 任务创建和删除*
stm32·单片机·嵌入式硬件
FreakStudio12 小时前
保姆级 uPyPi 教程|从 0 到 1:MicroPython 驱动包一键安装 + 分享全攻略
python·嵌入式·电子diy