首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >布尔特性更改回调,只对写入后的第一次更改执行

布尔特性更改回调,只对写入后的第一次更改执行
EN

Stack Overflow用户
提问于 2016-07-08 13:06:14
回答 2查看 1.7K关注 0票数 1

我尝试使用典型的方法订阅BLE特性通知:

代码语言:javascript
复制
stCharacteristic = stService.GetCharacteristics(stCharacteristicGUID)[0];
await stCharacteristic.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify);
stCharacteristic.ValueChanged += stData_ValueChanged;

回调函数还具有标准形式:

代码语言:javascript
复制
async void stData_ValueChanged(GattCharacteristic sender, GattValueChangedEventArgs args)
{
    var values = (await sender.ReadValueAsync()).Value.ToArray();
}

问题是,当BLE设备更改特征值时,回调并不总是被调用。当我写一些东西给特性,而设备写了一些响应,然后回调被调用。但是,如果设备只写到特性本身,回调就不会被调用。有趣的是,数据并没有丢失。当我再次写东西的时候,我会接到几个回调电话,同时收到由BLE设备发送的所有数据。换句话说,它看起来像是Windows或.NET框架缓存后续传入的数据,直到写入。只写完第一个特征后,就会触发回调。

  • 传入数据-没有回调
  • 发送数据
  • 收到的数据-两个回调!
  • 发送数据
  • 传入数据-一个回调
  • 输入数据
  • 输入数据
  • 输入数据
  • 发送数据-三个回调!

Windows 10,VS2015

EN

回答 2

Stack Overflow用户

发布于 2016-07-14 14:24:50

您不必读取ValueChanged回调中的值。该值已经存在于GattValueChangedEventArgs中。

除此之外,您的处理程序应该被直接调用,而不是在写完之后调用。您能看到您的设备是否在通知之间断开/连接吗?

票数 1
EN

Stack Overflow用户

发布于 2017-08-23 20:15:16

原来这是Windows 10的问题。而在Windows10.0.15063和更新版本上,比如10.0.16251,情况就更糟了--根本就没有回调。幸运的是,有一个简单的解决办法,需要添加两个注册表项。下面是.reg文件:

代码语言:javascript
复制
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID\{C6BFD646-3DF0-4DE5-B7AF-5FFFACB844A5}]
"AccessPermission"=hex:01,00,04,80,9c,00,00,00,ac,00,00,00,00,00,00,00,14,00,\
  00,00,02,00,88,00,06,00,00,00,00,00,14,00,07,00,00,00,01,01,00,00,00,00,00,\
  05,0a,00,00,00,00,00,14,00,03,00,00,00,01,01,00,00,00,00,00,05,12,00,00,00,\
  00,00,18,00,07,00,00,00,01,02,00,00,00,00,00,05,20,00,00,00,20,02,00,00,00,\
  00,18,00,03,00,00,00,01,02,00,00,00,00,00,0f,02,00,00,00,01,00,00,00,00,00,\
  14,00,03,00,00,00,01,01,00,00,00,00,00,05,13,00,00,00,00,00,14,00,03,00,00,\
  00,01,01,00,00,00,00,00,05,14,00,00,00,01,02,00,00,00,00,00,05,20,00,00,00,\
  20,02,00,00,01,02,00,00,00,00,00,05,20,00,00,00,20,02,00,00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID\YOURAPP.exe]
"AppID"="{C6BFD646-3DF0-4DE5-B7AF-5FFFACB844A5}"

将YOURAPP.exe更改为exe文件名。GUID可以改变或保持原样。应用此.reg文件后,每次都会立即调用回调,并且通知接收得非常好。

在写这个答案的时候,微软正在致力于一个永久的解决方案。解决办法和讨论在这里:https://social.msdn.microsoft.com/Forums/en-US/58da3fdb-a0e1-4161-8af3-778b6839f4e1/bluetooth-bluetoothledevicefromidasync-does-not-complete-on-10015063?forum=wdk

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38267504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档