iOS与ESP32 BLE通信异常:连接成功但无法收发数据
iOS与ESP32 BLE连接成功但数据收发异常排查方案
1. 字符串转char数组的边界问题
字符串转char时最容易忽略终止符'\0',导致串口输出乱码或截断。
- 错误示例:未预留终止符空间
String sendStr = "test"; char buf[4]; sendStr.toCharArray(buf, 4); // 仅复制4个字符,无终止符,串口输出会带乱码
- 正确写法:预留终止符空间
String sendStr = "test"; char buf[5]; // 多留1位给'\0' sendStr.toCharArray(buf, sizeof(buf));
2. BLE特征值属性配置错误
ESP32端的BLE特征值必须配置对应读写权限,否则数据无法正常传输:
- 需支持接收:配置
PROPERTY_WRITE/PROPERTY_WRITE_NR - 需支持主动推送:配置
PROPERTY_NOTIFY/PROPERTY_INDICATE - 正确配置示例:
BLECharacteristic *pCharacteristic = pService->createCharacteristic( CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE | BLECharacteristic::PROPERTY_NOTIFY );
3. 两端编码格式不统一
iOS端与ESP32端必须使用相同字符编码(推荐UTF-8),否则会出现解析异常:
- iOS端转码示例:
let sendStr = "hello" if let data = sendStr.data(using: .utf8) { peripheral.writeValue(data, for: targetCharacteristic, type: .withResponse) }
- ESP32端解析时直接按UTF-8处理即可,无需额外转换。
4. ESP32接收回调的缓冲区处理
接收回调中需严格按实际数据长度解析,避免固定长度导致的异常:
class BLECallbacks : public BLECharacteristicCallbacks { void onWrite(BLECharacteristic *pCharacteristic) { std::string rxData = pCharacteristic->getValue(); if (!rxData.empty()) { Serial.print("Received: "); Serial.println(rxData.c_str()); // 直接用c_str()转换为标准char数组 } } };
5. 串口波特率不匹配
ESP32代码中串口初始化的波特率需与串口监视器设置完全一致,比如代码中是Serial.begin(115200),监视器必须选择115200波特率,否则输出会乱码,易被误认为数据转换问题。
内容的提问来源于stack exchange,提问作者Ron
相关产品推荐
相关产品推荐

