为什么GattCharacteristic.ReadValueAsync()返回20个零字节?

时间:2015-10-20 23:59:52

标签: bluetooth-lowenergy win-universal-app gatt

我有以下代码用于连接TruConnect Bobcat蓝牙模块(https://ack.me/FAQs/What_are_the_UUID_s_used_by_TruConnect):

public async void Start()
    {           
        Guid RX_UUID = Guid.Parse("1cce1ea8-bd34-4813-a00a-c76e028fadcb");
        Guid TX_UUID = Guid.Parse("cacc07ff-ffff-4c48-8fae-a9ef71b75e26");
        Guid ServiceGuid = Guid.Parse("175f8f23-a570-49bd-9627-815a6a27de2a");

        var devices = await DeviceInformation.FindAllAsync(GattDeviceService.GetDeviceSelectorFromUuid(ServiceGuid));
        var service = await GattDeviceService.FromIdAsync(devices[0].Id);

        var TXCharacteristic = service.GetCharacteristics(TX_UUID)[0];
        GattReadResult result = await TXCharacteristic.ReadValueAsync(BluetoothCacheMode.Uncached);
        byte[] buffer = (result.Value.ToArray());
    }

问题是尽管我的模块没有发送任何内容,但最后的缓冲区总是以20个零字节结束。所有这些尽管结果.Status原来是成功。

这是我在尝试让它在更大的应用程序中运行并获得相同结果之后将其归结为。

我注意到的另一个有趣的事情是我在WindowsHubApplication上尝试了相同的方法并且它有效。现在,在通用应用程序中,它没有。

我也尝试了缓存和非缓存模式。

提前致谢

1 个答案:

答案 0 :(得分:1)

问题解决了! 我最初尝试订阅Characteristics.ValueChanged事件,但事件处理程序从未被调用过。显然,只有在您发送GattClientCharacteristicConfigurationDescriptorValue之后订阅该事件时,它才有效。 (我完全不知道为什么,也许有人可以对此有所了解,但现在它有效)

public async void Start()
    {           
        Guid RX_UUID = Guid.Parse("1cce1ea8-bd34-4813-a00a-c76e028fadcb");
        Guid TX_UUID = Guid.Parse("cacc07ff-ffff-4c48-8fae-a9ef71b75e26");
        Guid ServiceGuid = Guid.Parse("175f8f23-a570-49bd-9627-815a6a27de2a");

        var devices = await DeviceInformation.FindAllAsync(GattDeviceService.GetDeviceSelectorFromUuid(ServiceGuid));
        var service = await GattDeviceService.FromIdAsync(devices[0].Id);

        var TXCharacteristic = service.GetCharacteristics(TX_UUID)[0];
        var RXCharacteristic = service.GetCharacteristics(RX_UUID)[0];

        await TXCharacteristic.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify);     
        TXCharacteristic.ValueChanged += TXCharacteristic_ValueChanged; ;       
    }

    private void TXCharacteristic_ValueChanged(GattCharacteristic sender, GattValueChangedEventArgs args)
    {
        byte[] buffer = args.CharacteristicValue.ToArray();
    }

现在我得到了非常好的20字节缓冲区,其中填充了实际有效数据。