2016-08-09 107 views
3

Ich möchte den seriellen Anschluss eines angeschlossenen Bluetooth-Geräts in einer Xamarin Forms-Anwendung öffnen.UWP SerialDevice.FromIdAsync löst "Element nicht gefunden" aus (Ausnahme von HRESULT: 0x80070490) unter Windows 10

Hier ist der Code (I vereinfacht es, um das Problem zu veranschaulichen):

string l_gdsSelector = SerialDevice.GetDeviceSelector(); 
    var l_ardiDevices = await DeviceInformation.FindAllAsync(l_gdsSelector); 

    foreach(DeviceInformation l_diCurrent in l_ardiDevices) 
    { 
    if(l_diCurrent.Name.StartsWith("PX05")) 
    { 
     m_sdDevice = await SerialDevice.FromIdAsync(l_diCurrent.Id); 

     break; 
    } 
    } 

Dieser Code führt (Ausnahme von HRESULT: 0x80070490) "Element nicht gefunden" Ausnahme bei await SerialDevice.FromIdAsync

I kann es nicht glauben: "Element nicht gefunden", während DeviceInformation.FindAllAsync juste es als existierendes Gerät zurückgegeben hat!

Kann mir jemand dieses seltsame Verhalten erklären? und vor allem, wie man es löst?

Vielen Dank im Voraus

Antwort

1

Der erste Aufruf von DeviceInformation.FindAllAsync Funktion muss in UI-Thread gemacht werden. Da dieser Code Teil einer DLL ist, entschied ich mich, ihn immer im UI-Thread aufzurufen.

So, hier ist mein modifizierte Code:

TaskCompletionSource<bool> l_tcsResult = new TaskCompletionSource<bool>(); 

    await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
    Windows.UI.Core.CoreDispatcherPriority.Normal, async() => 
    { 
     try 
     { 
     m_sdDevice = await SerialDevice.FromIdAsync(p_strDeviceID); 

     l_tcsResult.SetResult(true); 
     } 
     catch (Exception l_exError) 
     { 
     l_tcsResult.SetException(l_exError); 

     System.Diagnostics.Debug.WriteLine(l_exError); 
     } 
    }); 

    await l_tcsResult.Task; 

Anwendung zu ermöglichen, mit seriellem Gerät zu kommunizieren, bearbeiten Sie bitte Paket manifest und folgenden Eintrag in Abschnitt hinzufügen:

<DeviceCapability Name="serialcommunication"> 
    <Device Id="any"> 
    <Function Type="name:serialPort" /> 
    </Device> 
</DeviceCapability> 
+0

http: // Stackoverflow. com/questions/41039362/exception-while-accessing-rfcommdeviceservice-from-a-wearable-in-uwp? noredirect = 1 # comment69297533_41039362 Ich habe eine ähnliche Ausnahme in meiner reinen UWP-Anwendung, beim Zugriff auf einen Bluetooth-Dienst. Woher beziehen Sie den Dispatcher? Wenn Sie sagen, der Aufruf muss im UI-Thread ausgeführt werden, meinen Sie den Hauptthread? Bitte helfen Sie! – sudarsanyes

+0

Hallo, normalerweise bedeutet UI-Thread Main-Thread. Tatsache ist, dass Windows den Benutzer fragt, wenn es FromIdAsync zum ersten Mal verwendet, um die Anwendung Bluetooth verwenden zu lassen. Es muss also eine Bestätigungsmeldung angezeigt werden. Es muss den UI-Thread (Hauptthread) verwenden. –

+0

Ich habe meinen Code mit CoreWindow.Dispatcher.RunAsync aktualisiert (... weil ich realisiert habe, dass Device.BeginInvokeOnMainThread von Xamarin nicht erwartet werden kann, dass führte zu unerwartetem Verhalten. –