Arduino ESP32 蓝牙串口通讯实验

本文介绍了一个使用Arduino ESP32-DevKitC进行蓝牙串口通信的实验,该实验旨在通过蓝牙实现无线串口调试。程序实现了串口与经典蓝牙(SPP)之间的数据桥接,确保蓝牙串口拥有类似正常串口的功能。在电脑端,通过设备和打印机设置添加并连接名为'ESP32test'的蓝牙设备,然后使用串口调试助手设置蓝牙串口进行数据收发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Arduino ESP32 蓝牙串口通讯实验


  • ✨这里的硬件使用的是ESP32-DevKitC支持经典蓝牙以及BLE,对于ESP32S3,以及ESP32C3只支持BLE,不支持经典蓝牙。

🎉目的:通过蓝牙串口输出,实现无线蓝牙串口调试

📗串口函数介绍

  • Serial.available() :返回串口缓冲区中当前剩余的字符个数。
  • Serial.print() :发送的是字符,
  • Serial.write() :发送的字节.

蓝牙串口继承类函数

  • SerialBT.available() :返回蓝牙串口缓冲区中当前剩余的字符个数。
  • SerialBT.print() :蓝牙串口发送的是字符,
  • SerialBT.write() :蓝牙串口发送的字节.

📝程序实例代码

//This example code is in the Public Domain (or CC0 licensed, at your option.)
//By Evandro Copercini - 2018
//
//This example creates a bridge between Serial and Classical Bluetooth (SPP)
//and also demonstrate that SerialBT have the same functionalities of a normal Serial

#include "BluetoothSerial.h"

#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif

BluetoothSerial SerialBT;

void setup() {
  Serial.begin(115200);
  SerialBT.begin("ESP32test"); //Bluetooth device name
  Serial.println("The device started, now you can pair it with bluetooth!");
}

void loop() {
  if (Serial.available()) {
    SerialBT.write(Serial.read());//将串口收到的数据,再通过蓝牙串口转发出去
    Serial.println("由SerialBT打印");
  }
  if (SerialBT.available()) {//将蓝牙串口收到的数据,再通过串口把信息发回给电脑
    Serial.write(SerialBT.read());
     Serial.println("由Serial打印");
  }
  delay(20);
}
  • 程序烧录后,重启esp32开发板,硬件串口打印信息
    在这里插入图片描述

🛠程序烧录完成后,给电脑端蓝牙设备添加

我的电脑-控制面板-所有控制面板-设备和打印机添加设备

在这里插入图片描述

  • 🌿或者在控制面板,直接点击添加设备
    在这里插入图片描述
  • 🌿或者在设置 - “蓝牙和打印机”
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 🌿会找到一个名叫"ESP32test",的设备。

在这里插入图片描述

  • 🌿用鼠标左键-点中这个设备,然后就是下一页只有选中该对象才能,下一页的哦!
  • 🌿驱动安装完成后,在电脑-计算机管理,可以查看到硬件蓝牙串口了。(会发现有两个蓝牙窗口)
    在这里插入图片描述
  • 🌿回到控制面板-“查看设备和打印机
    在这里插入图片描述
    在这里插入图片描述
  • 🌿查看具体蓝牙端口号
    在这里插入图片描述
  • 🔧利用串口调试助手设置蓝牙串口(友善串口调试助手)下载
    在这里插入图片描述

⛳蓝牙串口通讯窗口说明

在这里插入图片描述

📄硬件串口发数据,蓝牙串口转发(数据发送方式一)

在这里插入图片描述

📑esp32蓝牙串口发数据,硬件串口转发(数据发送方式二)

在这里插入图片描述

### ESP-IDF 下实现 ESP32 蓝牙串口通讯 #### 配置蓝牙协议栈 为了使 ESP32 支持蓝牙串口通讯,需先初始化并配置 Bluetooth 协议栈。这一步骤确保设备能够处理经典蓝牙和低功耗蓝牙的操作。 ```c #include "esp_bt.h" void init_bluetooth(void){ esp_err_t ret; // 初始化NVS闪存分区 ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { ESP_ERROR_CHECK(nvs_flash_erase()); ret = nvs_flash_init(); } // 开启蓝牙子系统 esp_bluedroid_status_t bt_stat; bt_stat = esp_bluedroid_get_status(); if(bt_stat==ESP_BLUEDROID_STATUS_UNINITIALIZED){ esp_bt_controller_config_t cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); ret=esp_bt_controller_init(&cfg); if(ret!=ESP_OK){ printf("Bluetooth controller initialize failed\n"); return; } ret=esp_bluedroid_init(); if(ret!=ESP_OK){ printf("bluetooth stack initialize failed\n"); return; } } } ``` 上述代码展示了如何启动蓝牙控制器以及蓝牙堆栈[^1]。 #### 创建 GATT Server 并设置服务表 GATT(通用属性)服务器用于管理 BLE 设备之间的数据交换。创建自定义的服务和服务特性来模拟串口行为。 ```c static void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) { /* 处理各种事件 */ } // 定义服务特征值 const uint8_t service_uuid[] ={ /* UUID 16bit or 128 bit here */ }; // 设置服务表格 const esp_gatts_attr_db_t gatt_db[]={ /* 特征声明及其权限等信息 */ }; ``` 此部分涉及构建 `gatt_server_service_table` 来描述可用的服务和它们各自的属性。 #### 数据接收与发送函数 编写读写回调机制以便于应用程序层可以监听到来的数据包,并向客户端发送响应消息。 ```c void send_data_to_client(const char* data){ // 发送数据给已连接的客户端... } uint16_t handle_received_data(uint8_t* value,uint16_t length){ // 解析接收到的数据... return length; } ``` 以上逻辑实现了基本的双向通信能力。 #### UART 和蓝牙桥接应用示例 最后,将物理UART接口映射至虚拟的BLE端点上完成整个系统的集成工作: ```c #define TXD_PIN (GPIO_NUM_17) #define RXD_PIN (GPIO_NUM_16) uart_config_t uart_config = { .baud_rate = 115200, .data_bits = UART_DATA_8_BITS, .parity = UART_PARITY_DISABLE, .stop_bits = UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_DISABLE }; int main(){ // 初始化硬件串口 uart_driver_install(UART_NUM_2,&uart_config,...); // 启动蓝牙服务 init_bluetooth(); while(true){ size_t available_bytes; uint8_t buffer[256]; // 检查是否有来自外部串口的新数据到达 int len = uart_read_bytes(UART_NUM_2,buffer,sizeof(buffer),pdMS_TO_TICKS(1)); if(len>0){ // 将新接收到的信息转发给远程蓝牙客户端 send_data_to_client((char*)buffer,len); } vTaskDelay(pdMS_TO_TICKS(1)); } } ``` 这段程序片段说明了怎样把传统RS232信号转成无线形式传递出去[^2]。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值