BLE读写通知错误:HRESULT 0x80650081问题排查及代码求助
问题描述
开发一款可读写蓝牙低能耗(BLE)室内自行车训练器的应用时,向特征值写入数据始终失败,抛出错误:Exception from HRESULT: 0x80650081。应用可正常读取设备数据,但写入操作在多台PC测试均报错。已按照训练器文档使用正确的操作码(OP code)和字节数据,尝试过WriteSingle、WriteInt16等不同写入方法,问题依旧。
相关代码片段:
else if (properties.HasFlag(GattCharacteristicProperties.Write)) { // This characteristic supports writing to it. Console.WriteLine($"\t\t[{characteristic.Uuid}] write property found"); var writer = new DataWriter(); // WriteByte used for simplicity. Other common functions - WriteInt16 and WriteSingle writer.WriteByte(0x00); GattCommunicationStatus resultWrite = await characteristic.WriteValueAsync(writer.DetachBuffer()); // the error shows here which leads to break the execution. if (resultWrite == GattCommunicationStatus.Success) { Console.WriteLine("Control Request access"); } writer = new DataWriter(); writer.WriteByte(0x01); resultWrite = await characteristic.WriteValueAsync(writer.DetachBuffer()); if (resultWrite == GattCommunicationStatus.Success) { Console.WriteLine("Reset request access"); // Successfully wrote to device } writer = new DataWriter(); writer.WriteByte(0x04); writer.WriteByte(0x64); resultWrite = await characteristic.WriteValueAsync(writer.DetachBuffer()); if (resultWrite == GattCommunicationStatus.Success) { Console.WriteLine("Resistance request access"); // Successfully wrote to device } }
问题排查与解决方案
1. 匹配特征的写入类型属性
BLE特征的写入属性分为Write(带响应)和WriteWithoutResponse(无响应)两种,默认调用WriteValueAsync使用的是带响应模式,若设备仅支持无响应写入则会报错。修改代码指定写入模式:
// 采用无响应写入适配设备 GattCommunicationStatus resultWrite = await characteristic.WriteValueAsync( writer.DetachBuffer(), GattWriteOption.WriteWithoutResponse);
2. 修正数据字节序
DataWriter默认使用大端字节序(Big-Endian),但多数BLE设备要求小端字节序(Little-Endian),需手动设置:
var writer = new DataWriter(); writer.ByteOrder = ByteOrder.LittleEndian; // 对齐设备的字节序要求
3. 避免连续写入无间隔
连续调用WriteValueAsync会导致BLE通信队列过载,设备无法及时处理,每次写入后添加短暂延迟:
// 写入后等待100ms再执行下一次操作 await Task.Delay(100);
4. 检查设备配对与权限
- 确认设备已完成配对,部分BLE设备仅允许配对后的写入操作;
- 在Windows设置中检查设备的BLE权限,确保应用拥有写入访问权限。
5. WriteValueAsync的替代方案
配置特征描述符后写入
部分设备要求先配置客户端特征描述符(CCCD)才能写入,例如启用通知/指示:
await characteristic.WriteClientCharacteristicConfigurationDescriptorAsync( GattClientCharacteristicConfigurationDescriptorValue.Notify);
使用GattSession底层控制
通过GattSession维护稳定连接,获得更底层的通信控制:
var session = GattSession.FromDeviceId(deviceId); session.MaintainConnection = true; // 之后再执行写入操作
内容的提问来源于stack exchange,提问作者Fahad Khan
相关产品推荐
相关产品推荐

