Daten über Bluetooth senden und empfangen

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

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

    tron25 schrieb:

    Bedeutet das, dass ich einfach die Package.appxmanifest in mein Projektverzeichnis kopieren kann und sie dann nutzbar ist?


    Takafusa schrieb:

    Ist doch eine Package.appxmanifest drin.


    Wenn du die richtige Vorlage für ein Projekt gewählt hast, ist die von Anfang an drin. Du musst keinen Text bearbeiten, nur wie schon gesagt, die Datei findest du im Projektmappenexplorer, mach nen doppelklick drauf, wechsel zum reiter "Funktionen", bei Bluetooth einen Haken rein und gut. In dem Projekt welches du hochgeladen hast ist das bereits getan.
    Ganz so einfach funktioniert es bei mir nicht. Wenn ich die package.appxmanifest in mein Projekt kopiere und dann im Projektexplorer doppelt darauf klicke, bekomme ich zwar den Code aber nicht die Registerkarten mit "Funktionen" "Anwendung", "Deklarationen", usw. angezeigt. Wenn ich das heruntergeladene Projekt öffne und dann auf die Datei doppelklicke, sieht es so aus, wie du es beschrieben hast. Unter dem folgenden Link habe ich eine Anleitung gefunden, wie man aus einer WPS eine UWP machen kann, bzw. eine UWP hinzufügen kann.

    microsoft-programmierer.de/Net…WPF,-Winforms-zu-UWP?2273

    Morgen werde ich mich damit mal auseinandersetzen.

    -----

    So, nun habe ich Folgendes leider erfolglos ausprobiert:

    1. Ich habe meinem Projekt ein UWP-Projekt hinzugefügt und auf der Registerkarte "Funktionen" "Bluetooth" angekreuzt. Dann habe ich das Nuget-Paket "microsoft.netcore.universalwindowsplatform" hinzugefügt. Leider wurden die folgenden Zeilen immer noch nicht erkannt:

    VB.NET-Quellcode

    1. Imports Windows.Devices.Bluetooth
    2. Imports Windows.Devices.Bluetooth.GenericAttributeProfile
    3. Imports Windows.Devices.Enumeration
    4. Imports Windows.UI.Core


    2. Ich habe meinem Projekt Verweise zu den folgenden Dateien versucht, hinzuzufügen:

    C:\Program Files (x86)\Windows Kits\10\UnionMetadata\Windows.winmd
    Hat funktioniert

    C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.Runtime.WindowsRuntime.dll
    Die Datei war leider nur als XML-Datei vorhanden. Die DLL habe ich in einem anderen Verzeichnis gefunden. Leider hat es danach trotzdem nicht funktioniert

    3. Ich habe gelesen, dass es UWP-APIs geben soll, die statt eines ganzen Projektes eingebunden werden können. Leider habe ich keine solche gefunden.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „tron25“ ()

    So, nun habe ich die UWP erneut hergestellt und alles mit Screenshots dokumentiert. Wie du auf dem letzten Screenshot siehst, wird der Namespace nicht erkannt, da die Anfangsbuchstaben nach dem Verlassen der Zeile immer noch klein geschrieben sind. Ich weiß nicht, wie ich dir das anders noch zeigen kann, dass es bei mir nicht funktioniert.

    Kann es sein, dass bei mir noch irgendwelche Nuget-Pakete oder Verweise fehlen?

    Sorry, aber "kleiner Sehrest" bedeutet bei mir, dass ich am Bildschirm nichts lesen kann. Das liegt auch daran, das mein Gesichtsfeld sehr klein und verschwommen ist. Versuche dir vorzustellen, dass du eine schwarze Brille hast, in dessen Gläser jeweils ein Loch in der Größe von einem dicken Stohhalm ist. Zudem sind mehrere Folien darübergeklebt, die das Bild sehr verschwommen darstellen.
    Bilder
    • Screenshot (5).png

      141,63 kB, 1.600×900, 75 mal angesehen
    • Screenshot (6).png

      129,99 kB, 1.600×900, 78 mal angesehen
    • Screenshot (7).png

      154,16 kB, 1.600×900, 84 mal angesehen
    • Screenshot (8).png

      142,94 kB, 1.600×900, 83 mal angesehen
    • Screenshot (9).png

      115,66 kB, 1.600×900, 77 mal angesehen
    • Screenshot (10).png

      167,44 kB, 1.600×900, 69 mal angesehen
    • Screenshot (11).png

      157,65 kB, 1.600×900, 78 mal angesehen
    • Screenshot (12).png

      139,38 kB, 1.600×900, 95 mal angesehen
    Also wie ich sehe, fügst du einem Projekt ein neues hinzu. Evtl. liegt es daran, keine Ahnung. Ich habe jetzt bei mir die Anzeige auf 150% skalliert und ein Video aufgezeichnet, ich hoffe du kannst das erkennen. Zu sehen ist wie ich ein ganz neues Projekt anlege, die manifest bearbeite und Bluetooth-Rechte eintrage. Die Importe hinzufüge und einmal kompiliere. Es geht ohne weiteres.



    Im Anhang das erstellte Projekt, wenn das auch nicht geht, liegt es an deinem Studio oder System.
    Dateien
    • App1001.zip

      (22,68 kB, 87 mal heruntergeladen, zuletzt: )
    Vielen Dank für deine Geduld. Es ist schon doof, wenn man nicht so gut sehen kann. Leider ist VS auch nicht komplett barrierefrei. Ich habe meine Frau dafür begeistern können, mit mir das Video durchzugehen ;-). Ich habe nun nach deiner Anleitung ein neues UWP-Projekt erstellt. In der Liste der Projekttypen habe ich die Filter so eingestellt, dass mir nur die UWPs in VB für Windows angezeigt werden. Mein zweites Problem war, dass sich die "MainPage.xaml.vb" im Verzeichnis "MainPage.xaml" versteckt hatte. Jetzt werden die zwei Imports korrekt eingefügt.

    Danach habe ich meinem PunktBilder-Projekt eine UWP auf die gleiche Weise hinzugefügt. Auch da hat es mit den Imports funktioniert.

    Jetzt möchte ich gerne aus dem Hauptprojekt aus auf die Bluetooth-Funktionen zugreifen.

    Die UWP soll später die Verbindung zum Brailledisplay herstellen und Datensätze mit den Punktbelegungen senden. Die Datensätze sollen aber im Hauptprogramm zusammengestellt werden und an die UWP übergeben werden. Ich habe in der Doku der UWP gelesen, dass die Funktionen, die mit der UWP kommunizieren, mit "async" deklariert werden und die Variablen mit "await". Ist da was wahres dran oder bin ich da wieder auf dem Holzweg?

    tron25 schrieb:

    Es ist schon doof, wenn man nicht so gut sehen kann.


    Das glaub ich dir auf's Wort. Ich habs mit den Ohren(Druckwelle einer Explosion in unmittelbarer Nähe), es ist zwar nicht so schlimm wie ich mir schlecht zu sehen vorstelle, aber manchmal auch schon recht nervig. Also du willst das in 2 Programe aufteilen, vermutlich ist dieses WPF/XAML zeugs nichts für dich(geht mir auch so). Ich glaube aber du wirst keine Möglichkeit haben irgendwas UWP techisches in normalen Framework zu verwenden. Ich kann mal schauen ob sich irgendas machen lässt.


    Gefunden habe ich ein Nuget Packet:(Für's normale Framework)
    nuget.org/packages/32feet.NET

    Mein BT-Headset und meine BT-Serials werden gefunden und gelistet. Probier das mal mit deinem BrailleDisplay, wenn das gefunden werden kann, kannst du damit möglicherweise was machen. Aber mit der Function BluetoothClient.DiscoverDevicesInRange klappte es nicht, nur mit der Function BluetoothClient.DiscoverDevices. Möglicherweise hängt das aber von gekoppelt/nicht gekoppelt zusammen.


    VB.NET-Quellcode

    1. Imports InTheHand.Net.Sockets
    2. Public Class Form1
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Dim client As BluetoothClient = New BluetoothClient()
    5. Dim devices As BluetoothDeviceInfo() = client.DiscoverDevices()
    6. For Each d As BluetoothDeviceInfo In devices
    7. If d.Connected Then
    8. Debug.WriteLine(d.DeviceName)
    9. End If
    10. Next
    11. End Sub
    12. End Class


    Hier ist auch ein C# Beispiel wie du da von einem Stream lesen wie auch reinschreiben kannst:
    stackoverflow.com/questions/41…ove-to-in-the-hand-32feet

    Ich denke das ist ein nützliches Nuget-Päckchen. Wenn du allerdings ohne Nuget Packet das Ziel erreichen willst, kannste auch die UWP und Framework APPs über TCP quatschen lassen, die UWP app wäre dann sowas wie ein Tunnel zum Gerät.

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Takafusa“ ()

    Ich habe die Beispielfunktion mal bei mir eingebaut. Das Display wird erkannt, aber als nicht verbunden angezeigt. Ich vermute, dass die Bluetooth-Sticks, die ich bei Amazon gekauft habe, wohl nicht die Besten sind. Ich habe nähmlich leider erfolglos versucht, meine Bluetoothtastatur und mein Baustellenradio, welches als Bluetoothlautsprecher benutzt werden kann, zu verbinden. Dann habe ich mir mal mein Laptop geschnappt uns es nochmal getestet. Hier konnte ich nicht nur die Tastatur pairen, sondern ich habe noch unsere Alexa und andere Bluetoothgeräte gesehen. Ich werde mir gleich ein etwas Besseres bei Amazon bestellen. Gibt es da, etwas, auf das ich besonders achten sollte? Ich dachte immer, dass Bluetooth keine Zauberei wäre.
    Um sicherzugehen das es verbunden ist, gehe in die systemsteuerung nach bluetooth & andere geräte, dort müsste dein display zu finden sein, klick da dann mal drauf dann siehst du es. Dann werden buttons sichtbar zum verbinden und trennen.

    tron25 schrieb:

    Gibt es da, etwas, auf das ich besonders achten sollte? Ich dachte immer, dass Bluetooth keine Zauberei wäre.


    EIgendlich sollte das Versions-Abwärtskompatibel sein. Hatte bisher zumindest keine Probleme. Also ich täte einfach nur drauf achten, das es eine der neuesten BT Versionen ist, bei mir halten die Dinger ewig, daher nehm ich gleich die neuesten.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Takafusa“ ()

    In der Systemsteuerung wird angezeigt, dass das Gerät gekoppelt ist. Ich habe mir gestern einen Bluetooth 5.0 Stick bestellt. Wenn er da ist, werde ich mich wieder melden.

    ----------

    Der Stick ist da und schon eingerichtet. Ich habe vorher sicherheitshalber alle Bluetooth einträge deinstalliert. Über den Menüpunkt "Ansicht" habe ich mir alle Geräte anzeigen lassen. So konnte ich auch ältere Einträge korrekt entfernen. Nun wird auch die Tastatur, erkannt und installiert. Sogar die Alexa wird angezeigt. Das HyperFlat habe ich auch verbunden. Die Funktion von dir zeigt aber nicht an, dass das Brailledisplay verbunden ist. Wenn ich die "mvbd.exe" starte und danach die Funktion ausführe, wird das Gerät angezeigt. Kann es sein, dass es ein Unterschied zwischen Gekoppelt und Aktiv gibt? Mir kam das Lautsprecherphänomen in den Sinn. Wenn ich beispielsweise die Sprachausgabe meines Handys auf einem Bluetooth-Lautsprecher ausgeben lasse, sind die Anfänge immer verschluckt, da wohl jedesmal eine neue Verbindung aufgebaut werden muß. Ich habe mir auch den Artikel angeschaut, auf den du verlinkt hattest. Aber, bevor ich Daten sende und empfange, sollte ich erst das Problem mit dem Verbindungsaufbau lösen. Hast du eine Idee? Ich habe ja den Namen des Gerätes (HyperFlat-76). Er wird mir mit

    VB.NET-Quellcode

    1. D.Devicename


    zurückgegeben. Eventuell könnte man das Gerät connecten. Bei einem Fehler, wüßte man, dass es nich verbunden ist.

    Übrigens, heute habe ich tatsächlich das erste Mal eine Braillegrafik auf dem Gerät erhalten. Dazu mußte ich ein wenig mit dem "mvbd" herumspielen. Leider ist das Programm nicht barrierefrei programmiert. Das ist ganz besonders sch...(ade), wail das Programm ja speziell für Blinde geschrieben ist.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „tron25“ ()

    tron25 schrieb:

    Übrigens, heute habe ich tatsächlich das erste Mal eine Braillegrafik auf dem Gerät erhalten. Dazu mußte ich ein wenig mit dem "mvbd" herumspielen. Leider ist das Programm nicht barrierefrei programmiert. Das ist ganz besonders sch...(ade), wail das Programm ja speziell für Blinde geschrieben ist.


    Das sehe ich auch so, aber wer wirklich nichts mehr sieht, der wird einen sehenden um Hilfe bitten müssen um so einem Gerät einzurichten. Das wird wohl auch der Hersteller denken. Ich weiss nicht was alles einstellbar ist, aber es sollte je nach Gerät einfach Profile geben, welche man einfach auswählen kann, oder sogar automatisch nach erkennung des Gerätes gewählt wird, so das nicht noch 10 Stunden Doku gelesen werden muss.


    Nun zum Koppeln und Verbinden, das sind tatsächlich 2 paar Schuhe. Koppeln(pairen) ist die erste Verbindung, wo man unter Umständen auch ein Passwort eingeben muss, die Geräte lernen sich sozusagen kennen, wisssen dann durch Userinteraktion(z.B. passworteingabe, bestätigen eines buttons, oder auch ohne) ob sie miteinander reden dürfen und auch wie, merken sich auch die Adresssen und Namen der Geräte. Gekoppelte Geräte werden dir in der Systemsteurerung unter bluetooth & andere geräte angezeigt, klickst du dort auf ein Gerät, erscheinen Buttons, für weitere Optionen, Wie verbinden/trennen und auch Gerät entfernen. Wenn du ein Gerät entfernst, mussst du es erneut mit dem Adapter/PC koppeln.

    Ich täte nun einfach schauen, ob man es via Code verbinden kann, wovon ich eigendlich ausgehen würde. Du iterierst ja schon durch die Devices, über BluetoothDeviceInfo bekommst du auch die Adresse, auf der Seite mit dem Code zum lesen und schreiben, wird mit BluetoothClient eine Verbindung hergestellt, das solltest du nun einfach mal versuchen.

    Da auch mit deinem alten BT-Adapter das Gerät gelistet wurde, hättest du höchstwarscheinlich gar keinen neuen gebraucht.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Takafusa“ ()

    Juhuu,

    trotz meinen bescheidenen Englisches habe ich es geschafft, das Gerät zu verbinden. Hier meine bisherige vorgehensweise für alle, die sich die Schnippsel nicht zusammensuchen möchten:

    Zuerst habe ich das Nuget-Paket "32feet.net" hinzugefügt. danach habe ich die folgenden Namespaces hinzugefügt:

    VB.NET-Quellcode

    1. Imports InTheHand.Net
    2. Imports InTheHand.Net.Sockets
    3. Imports InTheHand.Net.Bluetooth


    Dann habe ich mir ein Button erstellt und folgenden Code hineingeschrieben:

    VB.NET-Quellcode

    1. Dim Verbindung As New BluetoothClient
    2. Dim GekoppelteGeraete() As BluetoothDeviceInfo = Verbindung.DiscoverDevices()
    3. X = 0
    4. Do Until X >= GekoppelteGeraete.Count Or GekoppelteGeraete(X).DeviceName = "HyperFlat-76"
    5. X += 1
    6. Loop
    7. If X < GekoppelteGeraete.Count Then
    8. Dim Geraet As BluetoothDeviceInfo = GekoppelteGeraete(X)
    9. Dim Adresse As BluetoothAddress = Geraet.DeviceAddress
    10. Dim Ziel As New BluetoothEndPoint(Adresse, BluetoothService.SerialPort)
    11. Client.Connect(Ziel)
    12. Else
    13. Using InfoFenster As New InfoFormular
    14. InfoFenster.Text = "Hinweis"
    15. InfoFenster.Label1.Text = "Das Gerät HyperFlat-76 konnte nicht gefunden werden. Bitte überprüfen sie folgende Schritte:"
    16. InfoFenster.Label1.Text &= vbNewLine & "1. Der Bluetooth-Empfänger des Computers muß eingerichtet und aktiviert sein"
    17. InfoFenster.Label1.Text &= vbNewLine & "2. Schalten sie das Gerät ein"
    18. InfoFenster.Label1.Text &= vbNewLine & "3. Stellen sie sicher, das das Gerät gekoppelt ist."
    19. InfoFenster.Label1.Text &= vbNewLine & "4. Stellen sie sicher, dass sich das Gerät in Reichweite des Bluetooth-Empfängers befindet"
    20. InfoFenster.ShowDialog(Me)
    21. End Using
    22. End If


    Den Code habe ich von der Seite
    alanjmcf.me.uk/comms/bluetooth/32feet.NET -- User Guide.html

    Jetzt muß ich mein Englisch noch etwas mehr anstrengen, um herauszufinden, wie ich nun Bytearrays senden und empfangen kann.

    Ich habe mal was von dem Schlüsselwort "Async" im Funktionskopf gelesen, welches dafür sorgen soll, dass das Hauptprogramm nicht hängen bleibt, wenn eine Funktion mal etwas länger braucht. Im Zusammenhang damit gibt es auch das Wort "await". Gilt das nur für UWPs oder kann ich es auch in einem WPS verwenden?
    Hi!

    Schön das es soweit geklappt hat.

    Möcht anmerken das man besser für vbNewLine​ -> ​Environment.NewLine benutzt.
    Generell sollte man bei vb.net Projekten das ​Microsoft.VisualBasic Framework verbannen.

    Desweiteren, programmierst Du mit ​OptionStrict = On?
    Ich bin nun dabei, den Code in das Programm einzuarbeiten. Dafür habe ich die folgenden Zeilen in meine globalen Variablen geschrieben:

    VB.NET-Quellcode

    1. Imports InTheHand.Net
    2. Imports InTheHand.Net.Sockets
    3. Imports InTheHand.Net.Bluetooth
    4. Module GlobalesModul
    5. 'Variablen für eine Bluetooth-Verbindung
    6. Public Bluetoothverbindung As BluetoothClient
    7. Public GekoppelteBluetoothgeraete As BluetoothDeviceInfo
    8. Public Datenstrom As Stream
    9. end module


    Dann habe ich den folgenden Abschnitt in den Form_Load-Bereich geschrieben:

    VB.NET-Quellcode

    1. Select Case Brailleanzeige
    2. Case 2
    3. BluetoothVerbindungHerstellen("HyperFlat-76")
    4. End Select


    Bei 0 ist keine Brailleausgabe ausgewählt, bei 1 eine Braillezeile und bei 2 das Brailledisplay.

    Die entsprechende Funktion ist noch nicht ganz fertig. Hier habe ich folgendes Problem. In dieser Funktion sollen Variablen deklariert werden, die dann aber global verfügbar sein sollen. In meinem globalen Modul funktioniert das ja mit "public Variable ...". Wie kann ich das Gleiche in einer Form hinbekommen?

    VB.NET-Quellcode

    1. Private Sub BluetoothVerbindungHerstellen(Geraetename)
    2. GekoppelteBluetoothgeraete() = Bluetoothverbindung.DiscoverDevices()
    3. X = 0
    4. Do Until X >= GekoppelteBluetoothgeraete.Count Or GekoppelteBluetoothgeraete(X).DeviceName = Geraetename
    5. X += 1
    6. Loop
    7. If X < GekoppelteBluetoothgeraete.Count Then
    8. Dim Geraet As BluetoothDeviceInfo = GekoppelteBluetoothgeraete(X)
    9. Dim Adresse As BluetoothAddress = Geraet.DeviceAddress
    10. 'Die folgende Variable hätte ich gerne als global deklariert.
    11. Dim Ziel As New BluetoothEndPoint(Adresse, BluetoothService.SerialPort)
    12. If Not Bluetoothverbindung.Connected Then
    13. Bluetoothverbindung.Connect(Ziel)
    14. End If
    15. 'Der folgende Teil wird später in eine andere Funktion ausgelagert.
    16. AktuelleZeile = Chr(27) & Chr(50) & Chr(0) & Chr(0)
    17. For Zaehler As Integer = 1 To 36
    18. AktuelleZeile &= Chr(255)
    19. Next
    20. Datenstrom = Bluetoothverbindung.GetStream()
    21. Using DatenSchreiben = New StreamWriter(Datenstrom)
    22. DatenSchreiben.WriteLine(AktuelleZeile)
    23. DatenSchreiben.Flush()
    24. DatenSchreiben.Close()
    25. End Using
    26. Else
    27. Using InfoFenster As New InfoFormular
    28. InfoFenster.Text = "Hinweis"
    29. InfoFenster.Label1.Text = "Das Gerät HyperFlat-76 konnte nicht gefunden werden. Bitte überprüfen sie folgende Schritte:"
    30. InfoFenster.Label1.Text &= vbNewLine & "1. Der Bluetooth-Empfänger des Computers muß eingerichtet und aktiviert sein"
    31. InfoFenster.Label1.Text &= vbNewLine & "2. Schalten sie das Gerät ein"
    32. InfoFenster.Label1.Text &= vbNewLine & "3. Stellen sie sicher, das das Gerät gekoppelt ist."
    33. InfoFenster.Label1.Text &= vbNewLine & "4. Stellen sie sicher, dass sich das Gerät in Reichweite des Bluetooth-Empfängers befindet"
    34. InfoFenster.ShowDialog(Me)
    35. End Using
    36. End If
    37. End Sub
    Also diese Sache mit dem Modul finde ich :thumbdown: , mach dir eine Klasse wo das alles drin ist, dann kannste auch mehrere BT-verbindungen nutzen anstatt nur einer, indem du die Klasse mehrfach instanzierst. Module nutze ich nur für Extensions, oder in Konsolen(wird ja default ein Module statt eine Klasse im Projekt erstellt).

    Wenn aus einer Klasse etwas ausserhalb gebraucht wird, machste das Public und greifst über die Instanz drauf zu, sollen die von aussen nur gelesen werden und nicht verändert, ReadOnly. Oder füge eine Funktion oder Property hinzu die dir das ausgibt. Alles überall verfügbar zu machen, macht keinen Sinn, ausser man will Chaos im Projekt haben.
    Ich habe jetzt die folgenden Variablen oben in die Klasse geschrieben:

    VB.NET-Quellcode

    1. Public Class PunktbilderFormular
    2. Dim Bluetoothverbindung As New BluetoothClient
    3. Dim Datenstrom As Stream


    Nun habe ich folgendes Problem. Die Funktion "VerbindungHerstellen()" funktioniert soweit. Der Button danach soll einen string mit den Punktbelegungen an das Display senden. Beim ersten Mal funktioniert das auch. Wenn ich allerdings den Button ein weiteres Mal aktiviere bekomme ich folgenden Fehler:

    System.ObjectDisposedException: "Auf das verworfene Objekt kann nicht zugegriffen werden.
    Objektname: "BluetoothClient"."

    Angezeigt wird die Zeile

    VB.NET-Quellcode

    1. Datenstrom = Bluetoothverbindung.GetStream()


    Ich habe auch schon versucht, vor jedem weiteren Senden der Daten zu prüfen, ob die Verbindung noch steht. Wenn nicht, soll diese wie folgt neu aufgebaut werden:

    VB.NET-Quellcode

    1. If Not Bluetoothverbindung.Connected Then
    2. Dim Ziel As New BluetoothEndPoint(Bluetoothadresse, BluetoothService.SerialPort)
    3. Bluetoothverbindung.Connect(Ziel)
    4. End If


    Folgende Fehlermeldung wird angezeigt:
    System.ObjectDisposedException: "Auf das verworfene Objekt kann nicht zugegriffen werden.
    Objektname: "BluetoothClient"."

    die Zeile

    VB.NET-Quellcode

    1. Bluetoothverbindung.Connect(Ziel)

    wird dabei markiert.

    Bluetoothclient wird ganz oben in der Klasse deklariert, damit es auch bei weiteren Aktionen zur Verfügung steht. An welcher Stelle wird denn Bluetoothclient zerstört?
    Du benutzt ein Using Anweisung für den StreamWriter, am Ende wird auch der zugrunde liegende Stream geschlossen. Es gibt einen Konstrukor für den StreamWriter womit der zugrunde liegende Stream nicht geschlossen wird. möglicherweise wird so auch Bluetoothverbindung disposed.

    StreamWriter(Stream, Encoding, Int32, Boolean)

    VB.NET-Quellcode

    1. using streamWriter as new streamwriter(stream, System.text.encoding.default, -1, true)


    evtl. musst du das Encoding anpassen, weiss nicht welches dein Display verwendet. Sollte aber gehen, wenn du vorher kein anderes verwendet hast-

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Takafusa“ ()

    Vielen Dank, das Encoding hat gepaßt. Ich mußte nur aus der -1 eine 1 machen.

    So, nun werde ich mich mit dem Async und Await nochmal befassen, bevor ich dann die bisherigen Ergebnisse ummodele, sodass das Display die Daten nicht mehr von meiner Schaltfläche, sondern direkt von der Grafiktabelle des Programms erhält. Danach gibt es noch den Punkt mit dem Auswerten von Tastendrücken.

    tron25 schrieb:

    Danach gibt es noch den Punkt mit dem Auswerten von Tastendrücken.


    Kommt denn eine Nachricht über den Stream/RFCOMM Port, oder wird das Gerät auch gleichzeitig als Keyboard erkannt? Hab kürzlich erst beim Raspberry Pi Pico gestaunt, das der Sowohl als Serial wie auch als Joystick(Joystick war gewollt) im Gerätemanager gelistet wurde, hab mir so einen Arcade Controller gebaut, mit Klassischen Arcade Joystick und LED Buttons.

    Edit @tron25
    Wegen der -1 zu 1, ich hatte das so aus der Doku entnommen, da ist die bufferSize als default -1 gesetzt. Dafür habe ich aber bei ausnahmen übersehen
    ->ArgumentOutOfRangeException
    ->bufferSize ist ein negativer Wert.
    Passt irgendwie nicht ganz zusammen. Muss ein Fehler von MS sein.

    C#-Quellcode

    1. public StreamWriter (System.IO.Stream stream, System.Text.Encoding? encoding = default, int bufferSize = -1, bool leaveOpen = false);


    Wenn in der Doku des Gerätes was dazu steht, täte ich die dort angebenene puffergröße verwenden.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Takafusa“ ()

    Das Gerät wird nicht als Keyboard oder ähnlichem erkannt. Die Infos kommen wahrscheinlich über den RFComm.

    Ich habe weiterhin folgendes Problem festgestellt. Wenn ein Bluetooth-Stick eingesteckt ist, wird das Brailledisplay erkannt, wenn es eingeschaltet ist und korrekt nicht erkannt, wenn es nicht eingeschaltet ist. Wenn allerdings der Stick nicht eingesteckt ist, gibt es folgenden Fehler:

    System.PlatformNotSupportedException: "No supported Bluetooth protocol stack found."

    Es wird die Zeile

    VB.NET-Quellcode

    1. Dim Bluetoothverbindung As New BluetoothClient

    markiert. Diese Zeile steht ganz oben in der Klasse. Innerhalb einer Sub könnte ich das ja mit try abfangen. Gibt es die Möglichkeit, so etwas auch außerhalb einer Sub oder Funktion abzufangen? Um das etwas besser zu verdeutlichen, kommt hier eine stark verkürzte Version:

    VB.NET-Quellcode

    1. Imports InTheHand.Net
    2. Imports InTheHand.Net.Sockets
    3. Imports InTheHand.Net.Bluetooth
    4. Public Class PunktbilderFormular
    5. Dim Bluetoothverbindung As New BluetoothClient
    6. Dim Bluetoothadresse As BluetoothAddress
    7. Dim Datenstrom As Stream
    8. Public Sub PunktbilderFormular_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    9. BluetoothVerbindungHerstellen("HyperFlat-76")
    10. end sub
    11. Private Sub BluetoothVerbindungHerstellen(Geraetename)
    12. Dim GekoppelteBluetoothgeraete() As BluetoothDeviceInfo = Bluetoothverbindung.DiscoverDevices()
    13. X = 0
    14. Gefunden = False
    15. Do Until X >= GekoppelteBluetoothgeraete.Count Or Gefunden = True
    16. If GekoppelteBluetoothgeraete(X).DeviceName = Geraetename Then
    17. Gefunden = True
    18. Else
    19. X += 1
    20. End If
    21. Loop
    22. If X < GekoppelteBluetoothgeraete.Count Then
    23. Dim Bluetoothgeraet As BluetoothDeviceInfo = GekoppelteBluetoothgeraete(X)
    24. Bluetoothadresse = Bluetoothgeraet.DeviceAddress
    25. If Not Bluetoothverbindung.Connected Then
    26. Dim Ziel As New BluetoothEndPoint(Bluetoothadresse, BluetoothService.SerialPort)
    27. Bluetoothverbindung.Connect(Ziel)
    28. End If
    29. Else
    30. Using InfoFenster As New InfoFormular
    31. InfoFenster.Text = "Hinweis"
    32. InfoFenster.Label1.Text = "Das Gerät HyperFlat-76 konnte nicht gefunden werden. Bitte überprüfen sie folgende Schritte:"
    33. InfoFenster.Label1.Text &= vbNewLine & "1. Der Bluetooth-Empfänger des Computers muß eingerichtet und aktiviert sein"
    34. InfoFenster.Label1.Text &= vbNewLine & "2. Schalten sie das Gerät ein"
    35. InfoFenster.Label1.Text &= vbNewLine & "3. Stellen sie sicher, das das Gerät gekoppelt ist."
    36. InfoFenster.Label1.Text &= vbNewLine & "4. Stellen sie sicher, dass sich das Gerät in Reichweite des Bluetooth-Empfängers befindet"
    37. InfoFenster.ShowDialog(Me)
    38. End Using
    39. End If
    40. End Sub
    41. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    42. 'Hier wird ein Testmuster gesendet
    43. Dim Punkte As Integer = 255
    44. AktuelleZeile = Chr(27) & Chr(50) & Chr(0) & Chr(0)
    45. For Zaehler As Integer = 1 To 36
    46. AktuelleZeile &= Chr(Punkte)
    47. Next
    48. If Not Bluetoothverbindung.Connected Then
    49. Dim Ziel As New BluetoothEndPoint(Bluetoothadresse, BluetoothService.SerialPort)
    50. Bluetoothverbindung.Connect(Ziel)
    51. End If
    52. Datenstrom = Bluetoothverbindung.GetStream()
    53. Using DatenSchreiben As New StreamWriter(Datenstrom, System.Text.Encoding.Default, 1, True)
    54. DatenSchreiben.WriteLine(AktuelleZeile)
    55. DatenSchreiben.Flush()
    56. DatenSchreiben.Close()
    57. End Using
    58. End Sub
    59. end class
    )


    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „tron25“ ()