3

我正在尝试使用 Adafruit Bluefruit LE(蓝牙 4 模块)与 arduino 进行通信,一切都已设置并配对,但我的 GattCharacteristic 上的 ValueChanged 事件有问题,它在 30 分钟后停止触发和 40 次。

下面是这个的设置代码:

public class Bluetooth
{
    async public void Initialize()
    {
        var devices = await DeviceInformation.FindAllAsync(GattDeviceService.GetDeviceSelectorFromUuid(new Guid("6E400001-B5A3-F393-E0A9-E50E24DCCA9E")), null);

        GattDeviceService firstService = await GattDeviceService.FromIdAsync(devices[0].Id);

        GattCharacteristic rxCharacteristic = firstService.GetCharacteristics(new Guid("6E400003-B5A3-F393-E0A9-E50E24DCCA9E")).First();

        await rxCharacteristic.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify);

        rxCharacteristic.ValueChanged += rxCharacteristicValueChanged;
    }

    private void rxCharacteristicValueChanged(GattCharacteristic characteristic, GattValueChangedEventArgs e)
    {
        Console.WriteLine(e.CharacteristicValue.ToArray()[6]);
    }
}

是否有某种我需要清除的缓冲区或类似的东西?它看起来不像它的缓冲区相关,因为如果我将发送的数据减半,我不会得到两次调用,但我可能是错的。Arduino报告它仍在发送数据(通过串行链接,我可以看到蓝牙库仍在尝试发送数据,无论如何。我不确定如何验证数据是否实际发送)

任何帮助将不胜感激,甚至对要检查的事项提出建议。

4

2 回答 2

8

给定您的代码,听起来 GC 相关。

使firstService或其他东西成为字段级实例。

于 2015-02-06T04:46:06.397 回答
1

这是范围界定问题,似乎该GattCharacteristic对象在未知时间后被处置......

使您的特征成为一个全球性的、已解决的问题。

“您可能会发现您的应用程序在一段时间后停止接收来自设备的更新。这是一个范围界定问题,其中不应该处理的对象。这是因为 GattCharacteristic 在它应该被处理之前被处理,设置作为一个全球性的特征,而不是依赖于它被复制。”

于 2017-04-11T16:48:37.460 回答