40浏览
查看: 40|回复: 0

[ESP8266/ESP32] 关于ESP32-C5开发板ESP32 BLE Keyboard库的兼容性解决

[复制链接]
本帖最后由 创客编程张 于 2025-10-17 22:28 编辑

对于一些想要用esp32-c5做蓝牙键盘的创客者来说,大家一般都可以选择esp32 ble keyboard库,但是在操作过程中你会发现, ide又会进行报错,这是因为当前使用的 3.3.0-alpha1-cn 是测试版,兼容性较差,ESP32 开发板包版本与 ESP32 BLE Keyboard 库不兼容,具体是开发板包中的 BLE 库(BLECharacteristic.h)与键盘库使用的字符串类型不匹配(std::string vs String)。
现在我们需要解决这个问题。我们不能更换库版本我们只能去改变蓝牙接盘库
我们可以通过修改 ESP32 BLE Keyboard 库的源码来解决字符串类型不兼容的问题(std::string 与 String 冲突)。具体步骤如下:

问题根源
开发板包的 BLE 库(BLECharacteristic.h)中,setValue 函数要求参数为 Arduino 自带的 String 类型,而 ESP32 BLE Keyboard 库中使用了 C++ 标准库的 std::string 类型,导致类型不匹配。


解决方法:修改库源码中的字符串类型


1.找到库的安装路径
我们找到Arduino ide的库文件文件夹(libraries)
找到ESP32_BLE_Keyboard文件夹
找到BleKeyboard.cpp文件,用记事本打开
找到以下代码
  1. #include "BleKeyboard.h"
复制代码
在此处添加 #include <String.h>(引入 Arduino 的 String 类型):
  1. #include "BleKeyboard.h"
  2. #include <String.h>  
复制代码
搜索所有 std::string 并替换为 String(注意大小写):
例如:
原代码:std::string deviceName = "ESP32 BLE Keyboard";
改为:String deviceName = "ESP32 BLE Keyboard";
原代码:void BleKeyboard::setDeviceName(std::string deviceName) {
改为:void BleKeyboard::setDeviceName(String deviceName) {
原代码:std::string _manufacturerName;
改为:String _manufacturerName;
(全局替换,确保所有 std::string 都改为 String,包括变量定义、函数参数、返回值等)

2.修改 BleKeyboard.cpp 中的 substr 错误
找到以下代码
  1. , deviceManufacturer(String(deviceManufacturer).substr(0,15))
复制代码
将 substr 替换为 Arduino String 支持的 substring 方法:
  1. , deviceManufacturer(String(deviceManufacturer).substring(0,15))
复制代码
全局搜索文件中所有的 substr,全部替换为 substring(通常会有 2-3 处,比如设备名、制造商名的长度限制处理)。

3.修改头文件 BleKeyboard.h(同样在ESP32_BLE_Keyboard文件夹)
打开BleKeyboard.h文件,同样将所有 std::string 替换为 String:
原代码:#include <string>
可删除或注释掉(因为已改用 Arduino 的 String)。
原代码:void setDeviceName(std::string deviceName);
改为:void setDeviceName(String deviceName);
所有变量声明中的 std::string 均改为 String。

注:此处方法在大多库皆适用

4.疑难杂症问题解说
如果上传出现了这样的错误
  1. Sketch too big; see https://support.arduino.cc/hc/en-us/articles/360013825179 for tips on reducing it.
  2. text section exceeds available space in board
  3. Compilation error: text section exceeds available space in board
复制代码
编译提示 “Sketch too big” 是因为代码编译后的体积超过了 ESP32-C5 开发板的 Flash 存储空间限制(通常与开发板包配置的 Flash 分区有关)。
选择更大的 Flash 分区方案,例如:
若当前是 2MB (1MB APP/1MB SPIFFS),尝试改为 4MB (3MB APP/1MB SPIFFS)(根据开发板实际 Flash 大小选择,ESP32-C5 通常为 4MB 或 8MB)。
重新编译代码,查看是否能通过。


如果你还调用了稍大一点的库,有可能还会出现这样的错误
  1. Sketch too big; see https://support.arduino.cc/hc/en-us/articles/360013825179 for tips on reducing it.
  2. Sketch uses 1341749 bytes (102%) of program storage space. Maximum is 1310720 bytes.
  3. Global variables use 42512 bytes (12%) of dynamic memory, leaving 285168 bytes for local variables. Maximum is 327680 bytes.
  4. text section exceeds available space in board
  5. Compilation error: text section exceeds available space in board
复制代码
这是因为体积超出了内存限制可以对代码进行简化或选择更小的库
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail