求助:BLE Characteristic无法接收整数值的问题排查
解决BLE传递整数值被截断为8位的问题
核心问题分析
你遇到的问题本质是两个关键点:
- 变量类型溢出:你的读数(比如89943)已经超过Arduino标准
int的16位上限(32767),用int存储会直接溢出,导致数值提前出错。 - 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
相关产品推荐
相关产品推荐

