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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 18:05:18