BLE 协议栈之透传从机"Write error 13" 小忧伤

本文介绍了在实现BLE透传从机功能时遇到的'Write error 13'问题,该问题源于从机接收字节限制。通过修改simpleGATTprofile.c文件,增加接收缓冲区大小并更新配置解决了问题。同时,文章还提及了从机如何接收和发送数据的步骤,包括注册GATT Profile Callbacks和实现数据交换。

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

             从机接收主机来的数据并不像网上大部分博客说的那么简单,当然过程是很esay,如果只接收一个字节的数据而且不需要处理的话也很简单,但是涉及到多字节收发的时候,需要注意和处理的地方就很多了。我在调试透传功能时,由于没有合适的调试工具,只能引出串口看当前的数据,所以走了不少弯路,崩溃了近三天之后终于能稳定透传了。          

           在主机端配置好后,最大的疑惑莫过于当发送的字节数大于1时,主机直接返回的就是Write error 13 。开始以为是主机端有发送字节限制,但看遍代码仍旧没有找到字节限制的define。随后在从机里找错误信息,终于找到居然是从机接收有字节限制!!!定睛一看,simpleBLEperipheral例程给的代码里charac 1只能接收一个字节。OMG~~~~~~

         先说write error 13 ,其实是在simpleGATTprofile.csimpleProfile_WriteAttrCB函数中返回的。

 //Validate the value
        // Make sure it's not a blob oper
        if ( offset == 0 )
        {
          if ( len != 1 )
          { status = ATT_ERR_INVALID_VALUE_SIZE; }
        }
        else
        {
          status = ATT_ERR_ATTR_NOT_LONG;
        }

  Error 13 的定义

### ESP32蓝牙通信教程 #### 蓝牙简介 蓝牙是在2.4GHz频段内工作的无线电技术,用于短距离的数据输。ESP32作为一款集成WiFi和双模式蓝牙的微控制器平台,能够方便地将各种项目转变为无线设备[^1]。 #### 开发环境配置 为了使ESP32能顺利进行蓝牙通信,在开始编程前需完成必要的软硬件准备工作: - **软件准备**:安装最新版本的Arduino IDE,并添加ESP32开发板的支持包[^3]。 - **硬件准备**:准备好带有内置天线或其他形式外置天线的ESP32模块;确保拥有USB转TTL串口转换器以便于程序下载及调试信息查看。 #### 示例代码展示 ##### 经典蓝牙(Bluetooth Classic) 下面给出一段简单的Python风格伪代码,展示了如何利用ESP32的经典蓝牙接口发送字符串给已配对成功的Android手端应用程序: ```cpp #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() { // 初始化序列号通讯波特率9600bps Serial.begin(9600); // 创建名为 "ESP32Test" 的蓝牙服务名称 SerialBT.begin("ESP32Test"); } void loop() { if (Serial.available()) { // 如果有来自PC的消息,则转发至移动设备 String value = Serial.readString(); SerialBT.write(value.c_str()); } if(SerialBT.available()){ //如果有来自移动端的信息则打印出来 String value = SerialBT.readString(); Serial.println(value); } } ``` 这段代码实现了基本的数据功能——即接收自计算终端输入的内容并通过蓝牙链路递出去;同时也监听是否有来自远程客户端的数据到达并将其显示在本地监视器窗口中。 ##### 低功耗蓝牙(BLE) 对于BLE广播启动的例子如下所示: ```cpp #include <esp_bt_main.h> #include <esp_gap_ble_api.h> #include <esp_gatts_api.h> #include <nvs_flash.h> // 定义广播数据结构体... static esp_ble_adv_data_t adv_data = { .set_scan_rsp = false, .include_name = true, .manufacturer_len = 0, // 不包含制造商特定数据 }; extern "C" void app_main(void){ nvs_flash_init(); // 初始化NVS分区 /* ...其他初始化操作... */ // 注册GAP回调函数... esp_err_t ret = esp_bluedroid_enable(); if(ret != ESP_OK){ // 错误处理逻辑... } // 设置广告参数... esp_ble_gap_set_device_name("ESP32-BLE"); // 设备名设置为"ESP32-BLE" esp_ble_gap_config_adv_data(&adv_data); // 启动广播... esp_ble_gap_start_advertising(&adv_params); } ``` 上述代码片段主要负责初始化BLE协议栈、设定设备可见性和名称以及正式开启对外部请求者的通告过程。当执行到最后一条命令时,意味着ESP32已经开始向外宣告自己是一个可用的服务节点了[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值