Bluetoothverbindung zu ausgeschaltetem Gerät herstellen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von tron25.

    Bluetoothverbindung zu ausgeschaltetem Gerät herstellen

    Hallo,
    ich habe ein Anzeigegerät über Bluetooth mit dem PC verbunden. Die folgende Function versucht eine Verbindung zu diesem Gerät herzustellen:

    VB.NET-Quellcode

    1. Public Async Function Connect(Devicename As String) As Task(Of Boolean)
    2. Try
    3. Dim DeviceInfo As BluetoothDeviceInfo = Nothing
    4. Client = New BluetoothClient()
    5. Dim Devices As BluetoothDeviceInfo() = New BluetoothDeviceInfo() {}
    6. Await Task.Run(Sub()
    7. Devices = Client.DiscoverDevices()
    8. End Sub)
    9. For Each Device As BluetoothDeviceInfo In Devices
    10. If Device.DeviceName.ToLower().Equals(Devicename.ToLower()) Then
    11. DeviceInfo = Device
    12. End If
    13. Next
    14. If DeviceInfo Is Nothing Then
    15. Return False
    16. End If
    17. Dim EndPoint As New BluetoothEndPoint(DeviceInfo.DeviceAddress, BluetoothService.SerialPort)
    18. 'Beim Ausführen der folgenden Zeile stürzt das Programm ab.
    19. Client.Connect(EndPoint)
    20. If Client.Connected Then
    21. Datenstrom = Client.GetStream()
    22. Return True
    23. End If
    24. Return False
    25. Catch ex As PlatformNotSupportedException
    26. End Try
    27. End Function

    Wenn das Gerät eingeschaltet und mit dem PC verbunden ist, funktioniert es. Auch wenn der Bluetooth-Adapter nicht angeschlossen ist, wird eine entsprechende Meldung ausgegeben. Wenn allerdings der Adapter eingesteckt und das Gerät ausgeschaltet ist, stürzt das Programm ab. Ich schaffe es leider nicht, den Fehler abzufangen. Folgende Meldung wird in der Fehlerliste angezeigt:

    BC42105 Die Funktion "Connect" gibt nicht für alle Codepfade einen Wert zurück. Wenn das Ergebnis verwendet wird, kann zur Laufzeit eine NULL-Verweisausnahme auftreten.

    Ich war davon ausgegangen, dass "Try" im Fehlerfall in den Catch-Bereich springt.
    Hat jemand eine Idee, was ich übersehen habe?
    Ich habe etwas in den Catch-Bereich geschrieben. Leider ist das Programm nicht dort hineingesprungen. Auch das Auskommentieren von Try brachte leider nichts neues.

    Ich bekomme nun die Meldung:

    Sie müssen "AsyncMethodBuilder.cs" suchen, um die Quelle für den aktuellen Aufruflistenrahmen anzuzeigen.

    Zu diesem Thema habe ich im Netz ein paar wenige Beiträge gefunden. Die meisten haben es gelöst, indem sie einige Punkte in den Eigenschaften unter Debuggen eingestellt haben. Leider finde ich bei mir nur die folgenden Checkboxen:

    Remotecomputer verwenden
    Debuggen von nativem Code aktivieren
    SQL Server-Debuggen aktivieren
    Da du asyncron arbeitest funktioniert da wohl was nicht. Das suchen von Devices dauert bestimmt einen Moment, wegen dem Await wird nicht gewartet, die Schleife danach wird also sofort ausgeführt, da dieser Thread auf die Variable Devices zugreift wie möglicherweise auch der andere Task, könnte das einen Konflikt verursachen. Mach den Code ab Zeile 9 doch auch in die anonyme Sub. So ist jedenfalls sicher, das Devices nicht Nothing ist. Der Code funktioniert wenn das Gerät eingeschaltet ist? Wenn Client.DiscoverDevices() auch nur einen Moment braucht, bist du aber im UI-Thread? schon weiter, dann wäre DeviceInfo immer Nothing und es würde immer False von der Funktion kommen.

    Um den asyncronen Ablauf zu verdeutlichen, teste diesen Code:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. ShowMessage()
    3. MessageBox.Show("1")
    4. End Sub
    5. Private Async Sub ShowMessage()
    6. Await Task.Run(Sub()
    7. Threading.Thread.Sleep(2500)
    8. MessageBox.Show("2")
    9. End Sub)
    10. End Sub


    Hi,

    hat etwas gedauert. Ich habe eine zusätzliche Variable deklariert, die jedesmal, wenn versucht wird, die Verbindung aufzubauen, auf TRUE gesetzt wird. Erst, wenn entweder die Verbindung fehlschlägt, oder funktioniert, wird diese Variable wieder auf FALSE gesetzt. Wenn ich nun prüfen möchte, ob die Verbindung steht, prüfe ich erst, ob die Variable auf TRUE steht. Wenn ja, weiß ich, dass derzeit schon ein asynchroner Verbindungsaufbau läuft. Jetzt funktioniert es, wie es soll.

    Vielen Dank für eure Hilfe