BLE护肤设备写入配置索引0x0C后读取返回全0xFF值的问题排查与解决咨询
排查BLE护肤设备配置索引读写问题的解决方案
我仔细看了你的代码和问题描述,发现几个关键问题导致你读取到无效的FFFFFFFFFFFFFFFFFFF数据,下面帮你拆解并给出修复方案:
核心问题分析
- 写入的数据完全错误:你需要发送的是十进制12对应的十六进制
0x0C,但代码里写的是writer.WriteByte(0xc0)(对应十进制192),完全偏离目标值。 - 读写顺序&DataWriter逻辑混乱:你先调用
writer.DetachBuffer()再往writer里写数据,此时缓冲区已被清空,相当于发送了空数据;而且代码是先读取特征值,再执行写入操作,读取到的自然是写入前的无效默认值。 - 未确保写入完成后再读取:BLE操作是异步的,你需要等待写入确认成功后,再去读取对应的数据特征,而非在同一个遍历流程里直接读取。
修正后的代码实现
while (true) { if (device == null) { Thread.Sleep(200); continue; } Console.WriteLine("Press any key to pair the device."); Console.ReadKey(); Console.WriteLine(); BluetoothLEDevice bluetoothLeDevice = await BluetoothLEDevice.FromIdAsync(device.Id); Console.WriteLine("Attempting to pair with device"); GattDeviceServicesResult result = await bluetoothLeDevice.GetGattServicesAsync(); if (result.Status != GattCommunicationStatus.Success) { Console.WriteLine("Please, make sure the device is connected, and try again."); continue; } // 定位配置服务 var configService = result.Services.FirstOrDefault(s => s.Uuid.ToString() == configSvc); if (configService == null) { Console.WriteLine("Config service not found"); continue; } GattCharacteristicsResult charResult = await configService.GetCharacteristicsAsync(); if (charResult.Status != GattCommunicationStatus.Success) { Console.WriteLine("Failed to get characteristics"); continue; } // 分别找到配置索引特征(可写)和配置值特征(可读) var configIdxChar = charResult.Characteristics.FirstOrDefault(c => c.Uuid.ToString() == configIdxCt && c.CharacteristicProperties.HasFlag(GattCharacteristicProperties.Write)); var configValChar = charResult.Characteristics.FirstOrDefault(c => c.Uuid.ToString() == configValCt && c.CharacteristicProperties.HasFlag(GattCharacteristicProperties.Read)); if (configIdxChar == null || configValChar == null) { Console.WriteLine("Required characteristics not found"); continue; } // 步骤1:写入目标配置索引12(0x0C) var writer = new DataWriter(); writer.WriteByte(0x0C); // 修正为正确的十六进制值 GattCommunicationStatus writeStatus = await configIdxChar.WriteValueAsync(writer.DetachBuffer()); if (writeStatus != GattCommunicationStatus.Success) { Console.WriteLine("Error encountered on writing to config index characteristic!"); continue; } Console.WriteLine("Config index 12 sent successfully"); // 步骤2:给设备留处理时间(可根据设备文档调整延迟时长) await Task.Delay(100); // 步骤3:读取对应配置值 GattReadResult readResult = await configValChar.ReadValueAsync(); if (readResult.Status != GattCommunicationStatus.Success) { Console.WriteLine("Failed to read config value"); continue; } var reader = DataReader.FromBuffer(readResult.Value); byte[] input = new byte[reader.UnconsumedBufferLength]; reader.ReadBytes(input); Console.WriteLine("Received config data:"); string hexString = BitConverter.ToString(input).Replace("-", "").ToLower(); Console.WriteLine(hexString); } deviceWatcher.Stop();
关键修复点说明
- 修正写入数据:将
0xc0改为0x0C,匹配你需要的十进制12。 - 调整读写流程:先定位目标特征,完成写入操作并确认成功后,再执行读取操作,确保逻辑顺序符合设备交互要求。
- 修复DataWriter使用:先写入数据再调用
DetachBuffer(),保证发送的是有效数据。 - 简化特征查找:用
FirstOrDefault替代遍历,代码更简洁,避免遍历过程中的逻辑混乱。 - 增强错误处理:每个异步操作都增加了状态判断,便于快速定位问题。
另外,建议你对照设备文档确认:写入配置索引后是否需要额外的确认指令,或者是否需要更长的处理延迟,部分BLE设备需要短暂时间完成配置切换。
内容的提问来源于stack exchange,提问作者Jungle Zee
相关产品推荐
相关产品推荐

