Arduino调用BLECharacteristic.setValue时类型转换报错求助
解决BLECharacteristic setValue类型转换错误
报错原因
你调用的setValue方法要求传入**无符号字符数组(unsigned char[])**和对应的长度参数,但你直接传入了int32_t类型的数值,类型不匹配导致报错。
解决代码
方法1:手动拆分字节(直观可控)
替换setup里的setValue调用代码:
void setup() { ... blePeripheral.addAttribute(file_maximum_length_characteristic); // 将int32_t转为uint32_t,匹配Characteristic定义的类型大小 uint32_t max_bytes = static_cast<uint32_t>(file_maximum_byte_count); // 按小端字节序拆分32位整数为4字节数组(多数BLE设备默认) unsigned char byte_array[4]; byte_array[0] = static_cast<unsigned char>(max_bytes & 0xFF); byte_array[1] = static_cast<unsigned char>((max_bytes >> 8) & 0xFF); byte_array[2] = static_cast<unsigned char>((max_bytes >> 16) & 0xFF); byte_array[3] = static_cast<unsigned char>((max_bytes >> 24) & 0xFF); // 调用正确的setValue重载方法 file_maximum_length_characteristic.setValue(byte_array, sizeof(byte_array)); ... }
方法2:用union转换(简洁)
通过联合体实现整数到字节数组的直接转换:
// 在全局或setup外定义联合体 union IntByteConverter { uint32_t int_value; unsigned char byte_array[4]; }; void setup() { ... blePeripheral.addAttribute(file_maximum_length_characteristic); IntByteConverter converter; converter.int_value = static_cast<uint32_t>(file_maximum_byte_count); file_maximum_length_characteristic.setValue(converter.byte_array, sizeof(converter.byte_array)); ... }
注意事项
- 字节序:如果你的蓝牙应用要求大端字节序,需要调整数组的字节顺序(交换
byte_array[0]与byte_array[3],byte_array[1]与byte_array[2])。 - 类型匹配:将
int32_t转为uint32_t是为了和你定义Characteristic时的sizeof(uint32_t)对应,避免符号位干扰。
内容的提问来源于stack exchange,提问作者lcj
相关产品推荐
相关产品推荐

