You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 07:17:09