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

求助:BLE Characteristic无法接收整数值的问题排查

解决BLE传递整数值被截断为8位的问题

核心问题分析

你遇到的问题本质是两个关键点:

  1. 变量类型溢出:你的读数(比如89943)已经超过Arduino标准int的16位上限(32767),用int存储会直接溢出,导致数值提前出错。
  2. BLE特征类型不匹配:BLECharCharacteristic本身就是8位特征,最多存0-255的数值;就算用BLEIntCharacteristic,如果前面变量溢出了,传出去的也是错误值。

分步解决方案

1. 修正变量类型,避免数值溢出

把代码里的int reading;改成long reading;或者int32_t reading;,确保能容纳89943这类大数值:

void loop() {
  long reading; // 替换原来的int类型
  // ... 后续代码不变
}

2. 正确定义BLE特征

在setup()里必须使用32位整数特征,不能用BLECharCharacteristic。示例定义如下:

// 放在setup()函数外面,定义服务和特征
BLEService loadSensorService("ABCD"); // 自定义服务UUID,可自行修改
BLEIntCharacteristic readingCharacteristic("1234", BLERead | BLENotify); // 32位有符号整数特征,支持读和通知

void setup() {
  Serial.begin(9600);
  while (!Serial);

  // 初始化BLE模块
  if (!BLE.begin()) {
    Serial.println("BLE初始化失败");
    while (1);
  }

  // 配置BLE服务与特征
  BLE.setLocalName("LoadSensor");
  BLE.setAdvertisedService(loadSensorService);
  loadSensorService.addCharacteristic(readingCharacteristic);
  BLE.addService(loadSensorService);
  readingCharacteristic.setValue(0); // 设置初始值
  BLE.advertise();
}

3. 确保setValue调用正确

如果用long类型的reading,直接传给BLEIntCharacteristic的setValue即可,库会自动处理类型转换:

reading = adc.readFB(0, 2.5, 500000.00);
readingCharacteristic.setValue(reading);

4. 接收端正确解析

不管是用手机BLE调试工具还是其他设备,接收时必须选择32位有符号整数的解析方式,别选8位/16位字节模式,否则读出来的还是截断后的值。

额外检查点

  • 确认你的Arduino板int位数:比如Uno是16位,ESP32是32位,89943在16位int里会溢出,所以必须用long/int32_t。
  • 确保BLE服务和特征在setup()里正确初始化并添加到BLE栈中,否则特征不会被广播出去。

内容的提问来源于stack exchange,提问作者Marty W

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:40:24