为什么GattDeviceService.FromIdASync()无法完成?

为什么GattDeviceService.FromIdASync()无法完成?

问题描述:

我正在开发Windows 10通用应用程序,通过HM-10芯片与嵌入式系统进行通信。为什么GattDeviceService.FromIdASync()无法完成?

我曾尝试和其他情况

芯片设置,有连接到它没有问题。从这些设备的iPhone应用程序中,我可以通过Arduino Serial窗口和iPhone应用程序进行双向通信。 我的电脑也可以看到它,并可以从Microsoft提供的示例应用程序连接到它。

在运行之前,它已在蓝牙设置中配对和连接。我也试过没有配对和连接,但它没有被DeviceInformation发现。

MainPage.xaml.cs中

using System; 
using System.Diagnostics; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Runtime.InteropServices.WindowsRuntime; 
using Windows.Foundation; 
using Windows.Foundation.Collections; 
using Windows.UI.Xaml; 
using Windows.UI.Xaml.Controls; 
using Windows.UI.Xaml.Controls.Primitives; 
using Windows.UI.Xaml.Data; 
using Windows.UI.Xaml.Input; 
using Windows.UI.Xaml.Media; 
using Windows.UI.Xaml.Navigation; 
using Windows.Devices.Enumeration; 
using Windows.Devices.Bluetooth; 
using Windows.Devices.Bluetooth.GenericAttributeProfile; 
using System.Threading.Tasks; 

// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409 

namespace App1 
{ 
    /// <summary> 
    /// An empty page that can be used on its own or navigated to within a Frame. 
    /// </summary> 
    /// 

    public sealed partial class MainPage : Page 
    { 

     public List<string> deviceList = new List<string>(); 
     public MainPage() 
     { 
      this.InitializeComponent(); 
      Debug.WriteLine("A"); 
      var taskDevices = getDevices(); 
      Task.WaitAll(taskDevices); 
      Debug.WriteLine("B"); 

     } 
     public async Task<List<string>> getDevices() 
     { 
      Debug.WriteLine("C"); 
      foreach (DeviceInformation di in await DeviceInformation.FindAllAsync(GattDeviceService.GetDeviceSelectorFromUuid(GattServiceUuids.GenericAccess), null)) 
      { 
       Debug.WriteLine("D"); 
       Debug.WriteLine(di.Name); 
       Debug.WriteLine(di.Id); 
       Debug.WriteLine(di.IsEnabled); 
       var bleDevice = await GattDeviceService.FromIdAsync(di.Id); 
       Debug.WriteLine("E"); 
       // Add the dvice name into the list. 
       // deviceList.Add(bleDevice.Name); 
      } 
      return deviceList; 
     } 

     private void button_Click(object sender, RoutedEventArgs e) 
     { 

     } 

     private void textBox_TextChanged(object sender, TextChangedEventArgs e) 
     { 

     } 

我做的搜索,我意识到清单需要一个除了具有蓝牙功能。

Package.appxmanifest

<?xml version="1.0" encoding="utf-8"?> 
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" xmlns:m2="http://schemas.microsoft.com/appx/manifest/foundation/windows10" IgnorableNamespaces="uap mp"> 
    <Identity Name="acbf6f03-e62b-4d1e-8c25-9f649ca5af4c" Publisher="CN=Boomkin" Version="1.0.0.0" /> 
    <mp:PhoneIdentity PhoneProductId="acbf6f03-e62b-4d1e-8c25-9f649ca5af4c" PhonePublisherId="00000000-0000-0000-0000-000000000000" /> 
    <Properties> 
    <DisplayName>App1</DisplayName> 
    <PublisherDisplayName>Boomkin</PublisherDisplayName> 
    <Logo>Assets\StoreLogo.png</Logo> 
    </Properties> 
    <Dependencies> 
    <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" /> 
    </Dependencies> 
    <Resources> 
    <Resource Language="x-generate" /> 
    </Resources> 
    <Applications> 
    <Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="App1.App"> 
     <uap:VisualElements DisplayName="Histamine Control Panel" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png" Description="App1" BackgroundColor="transparent"> 
     <uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png"> 
     </uap:DefaultTile> 
     <uap:SplashScreen Image="Assets\SplashScreen.png" /> 
     </uap:VisualElements> 
    </Application> 
    </Applications> 
    <Capabilities> 
    <m2:DeviceCapability Name="bluetooth.genericAttributeProfile"> 
     <m2:Device Id="any"> 
     <m2:Function Type="serviceId:00001800-0000-1000-8000-00805f9b34fb"/> 
     </m2:Device> 
    </m2:DeviceCapability> 
    </Capabilities> 
</Package> 

我已经尝试了很多其他版本,添加和删除internetclient和蓝牙功能,没有任何成功。我目前猜测问题出现在这里。

问题

当问题国FromIdAsync部分不返回任何东西。甚至不是空(正如我在这里看到的许多其他问题),它只是没有完成,最终线程存在。

登录

A 
C 
D 
HIST 
\\?\BTHLEDevice#{00001800-0000-1000-8000-00805f9b34fb}_f45eabaaf694#8&2782425b&13&0006#{6e3bb679-4372-40c8-9eaa-4509df260cd8} 
True 

然后等待一段时间后

The thread 0x3c6c has exited with code 0 (0x0). 

谢谢你,我真的很感谢所有帮助。

你的问题是在这里:

Task.WaitAll(taskDevices); 

Blocking on asynchronous code causes a deadlock。正确的解决方案是使用async all the way

在您的具体情况下,您需要(同步,立即)在“加载”状态下创建视图 - 但是您希望看起来如此。然后,当异步代码完成时,将您的视图更新为“加载”状态。有关更多信息,请参阅我的MSDN文章async data binding