ESP32主从模式收发实验(搞定)

超级程序猿飞 2023-04-27 18:02:37

ESP32模块自带蓝牙和WiFi

 

上一篇blog写了蓝牙和串口间的通信

现在实现了ESP32两个蓝牙之间的通信

代码如下:

网上唯一的代码用的是主机搜索从机的MAC地址

我尝试了调不通

后面修改成搜索蓝牙名称连接,成功

现在把代码分享如下:

Master:

//主机模式
#include <Arduino.h>
#include <BluetoothSerial.h>

BluetoothSerial SerialBT;

#define Master 1    //主从机模式选择 1主机 0从机
String SlaveName="ESP32_SLAVE";

void Bluetooth_Event(esp_spp_cb_event_t event, esp_spp_cb_param_t *param);  //蓝牙事件回调函数

uint8_t address[6]={0xB0,0xB2,0x1C,0xA8,0x10,0xD0}; //从机MAC地址 不同的蓝牙地址不同 需要自己修改
//B0B21CA810D0(com3)
void setup() {

    Serial.begin(115200);

    SerialBT.register_callback(Bluetooth_Event); //设置事件回调函数 连接 断开 发送 接收

    if(Master)
    {
        SerialBT.begin("ESP32_MASTER",true); //开启蓝牙 名称为:"ESP32_MASTER" 主机
        Serial.printf("Init Complete - Master\r\n");
        SerialBT.connect(SlaveName);
    }
    else
    {
        SerialBT.begin("ESP32_SLAVE");       //开启蓝牙 名称为:"ESP32_SLAVE" 从机
        Serial.printf("Init Complete - Slave\r\n");
        SerialBT.connect(address);
    }

}

void loop()
{
    if(Master)
        SerialBT.write('S');
    Serial.println("loop");
    delay(3000);
}

void Bluetooth_Event(esp_spp_cb_event_t event, esp_spp_cb_param_t *param)  //蓝牙事件回调函数
{
    if(event == ESP_SPP_OPEN_EVT || event == ESP_SPP_SRV_OPEN_EVT) //蓝牙连接成功标志 
    {                                                              //蓝牙主机和从机模式对应的标志不同,前面的是主机模式的,后面是从机模式
        Serial.write("connection successful!\r\n");
    }
    else if(event == ESP_SPP_CLOSE_EVT)     //蓝牙断开连接标志
    {
        Serial.write("disconnect successful!\r\n");
    }
    else if(event == ESP_SPP_DATA_IND_EVT)  //数据接收标志
    {
        while(SerialBT.available())
        {
            Serial.write(SerialBT.read());
        }
        Serial.write("  receive complete! \r\n");
    }
    else if(event == ESP_SPP_WRITE_EVT)     //数据发送标志
    {
        Serial.write("  send complete! \r\n");
    }
}

Slave:

//主机模式
#include <Arduino.h>
#include <BluetoothSerial.h>

BluetoothSerial SerialBT;

#define Master 0    //主从机模式选择 1主机 0从机
String MasterName="ESP32_MASTER";

void Bluetooth_Event(esp_spp_cb_event_t event, esp_spp_cb_param_t *param);  //蓝牙事件回调函数

uint8_t address[6]={0xB0,0xB2,0x1C,0xA7,0x9A,0x7C}; //从机MAC地址 不同的蓝牙地址不同 需要自己修改
//B0B21CA79A7C(com3)
void setup() {

    Serial.begin(115200);

    SerialBT.register_callback(Bluetooth_Event); //设置事件回调函数 连接 断开 发送 接收

    if(Master)
    {
        SerialBT.begin("ESP32_MASTER",true); //开启蓝牙 名称为:"ESP32_MASTER" 主机
        Serial.printf("Init Complete - Master\r\n");
        SerialBT.connect(MasterName);
    }
    else
    {
        SerialBT.begin("ESP32_SLAVE");       //开启蓝牙 名称为:"ESP32_SLAVE" 从机
        Serial.printf("Init Complete - Slave\r\n");
        SerialBT.connect(address);
    }

}

void loop()
{
    if(Master)
        SerialBT.write('A');
    Serial.println("loop");
    delay(300);
}

void Bluetooth_Event(esp_spp_cb_event_t event, esp_spp_cb_param_t *param)  //蓝牙事件回调函数
{
    if(event == ESP_SPP_OPEN_EVT || event == ESP_SPP_SRV_OPEN_EVT) //蓝牙连接成功标志 
    {                                                              //蓝牙主机和从机模式对应的标志不同,前面的是主机模式的,后面是从机模式
        Serial.write("connection successful!\r\n");
    }
    else if(event == ESP_SPP_CLOSE_EVT)     //蓝牙断开连接标志
    {
        Serial.write("disconnect successful!\r\n");
    }
    else if(event == ESP_SPP_DATA_IND_EVT)  //数据接收标志
    {
        while(SerialBT.available())
        {
            Serial.write(SerialBT.read());
        }
        Serial.write("  receive complete! \r\n");
    }
    else if(event == ESP_SPP_WRITE_EVT)     //数据发送标志
    {
        Serial.write("  send complete! \r\n");
    }
}

实验还是得自己完成查看实验结果后确定截图如下

 发送的是S

接收端接收到S

...全文
675 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

11

社区成员

发帖
与我相关
我的任务
社区描述
阿弥陀佛
物联网 高校 新疆·阿克苏地区
社区管理员
  • 宇宙作家
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧