2015-10-20 3 views
0

У меня есть следующий код, я использую для подключения к модулю Bluetooth TruConnect Bobcat (https://ack.me/FAQs/What_are_the_UUID_s_used_by_TruConnect):Почему GattCharacteristic.ReadValueAsync() возвращает 20 нулевых байтов?

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 нулевых байтами, хотя мой модуль ничего не отправляет. Все это несмотря на результат. Статус оказывается успешным.


Это то, что я сварил, чтобы попытаться запустить его в большом приложении и получить тот же результат.


Еще одна интересная вещь, которую я заметил, что я попробовал один и тот же подход на WindowsHubApplication, и она работала. Теперь в универсальном приложении это не так.


Я также пробовал как режимы кэширования, так и без кэширования.

Заранее благодарен

+0

Попробуйте прослушивать OnCharacteristicChanged и OnCharacteristicRead, это работает для меня, я получаю различные размеры буфера до 20 байт. – pogorman

ответ

0

Проблема решена! Я изначально попытался подписаться на событие Characteristic.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 байты буферов заполнен с фактическими действительными данными.