Daten von VB Programm an Raspberry Pi senden und zurück (via USB-Port)

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

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von ClonkAndre.

    Daten von VB Programm an Raspberry Pi senden und zurück (via USB-Port)

    Hallo Community,

    ich habe vor mit meinem Raspberry Pi ein Elgato Stream Deck zu bauen weil der Raspberry Pi einfach super und günstig ist ;)

    Nun möchte ich es schaffen das ich Daten von einem VB.NET Programm an den Raspberry Pi über USB sende. (Und diese Daten werden dann mit Python weiterverarbeitet)

    Nur habe ich noch nie etwas in dieser Richtung gemacht (Serial Port, USB Entwicklung). Nun wie schaffe ich es das ich Daten von meinem Programm an den RPi sende? Und: Wie finde ich den Port raus an dem der RPi an meinem PC angeschlossen ist um überhaupt eine Verbindung herzustellen?

    Vielleicht auch noch gut zuwissen: Ich benutze einen Raspberry Pi Zero WH
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    @ClonkAndre Der Raspberry ist ein Rechner wie ein Laptop oder so, d.h., wenn Du iwas an ihn senden willst, musst Du dort ein Programm laufen haben, dass Daten empfängt.
    Mir scheint, dass Du USB im Sinne einer Netzwerk-Verbindung verwenden willst, das dürfte so nicht gehen.
    Ich hab mich mal mit nem Raspberry "unterhalten", das ging über TCP.
    Eine RaspiCam machte ein Bild und legte es im Raspberry ab, ich habe es per Netzwerk-Verbindung abgeholt und dann dort gelöscht.
    Was kann oder macht denn dieses STREAM DECK? Ist das so ne Multimedia-Maschine?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    In dem Fall habe ich ein Python Script auf dem RPi am laufen. Das Stream Deck ist ein kleines Gerät was unteranderem für Streamer entworfen wurde. Auf dem Stream Deck gibt es 15 Knöpfe die du alle beliebig konfigurieren kannst über einer Desktop-App. Und ich habe es auch schon geschafft Daten vom RPi an meinem Computer zusenden undzwar Shortcuts das funktionierte auch prima (So sah es aus) :) Nun wollte ich aber ein bisschen mehr undzwar das ich die Buttons über ein Programm auch selber einstellen kann. Also Daten vom RPi zum Pc zusenden war sehr einfach da der RPi wie eine Tastertur fungierte. Das Problem ist jedoch: Ich habe es schonmal getestet man kann keine Daten von einem PC an einem RPi senden da der RPi als Tastertur erkannt wurde und das Test-Programm was ich im Internet gefunden habe hat dies nicht erlaubt daten an einer "Tastertur" zusenden.
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    @ClonkAndre Es sieht so aus, als solten sich zwei Server miteinander unterhalten, das geht so nicht.
    Wenn ein Server läuft, muss sich ein Client bei ihm anmelden, um Kontakt aufzunehmen.
    Probierma, ob Du in dieser Richtung was findest.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Nahh, ich würde das ganze gerne "Plug & Play" machen. Der Benutzer steckt den RPi via USB an seinem PC, downloaded sich die Software und kann über der Software die Knöpfe des RPi's konfigurieren. Server wäre da wirklich eine gute Idee doch, geht das nicht auch irgendwie direkt über USB?
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!

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

    ClonkAndre schrieb:

    geht das nicht auch irgendwie dirket über USB?
    Nach meinem Kenntnisstand nicht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @wolfi_bayern
    Der PI soll Shortcuts an den PC über USB senden wie STRG + 1 er soll ähnlich wie eine virtuelle Tastertur fungieren, wenn man das so sagen kann.

    @RodFromGermany
    Okay, ich schaue mich dann nochmal um.
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    Hi.

    Habe das RPi Zero mit W ohne H, aber Lötkolben... :D

    Wenn der RaspberryPi per USB am "Empfangsrechner" angeschlossen wird, dann reicht es aus die Serielle ausgabe des Pi abzufangen.

    Dann Mittels-mann/frau/divers Programmieren, der die Seriellen Daten versteht, und dann "verteilt" kann Python, das I-Net oder gar SMS sein.

    Soll das nur per W-Lan geschehen, muss dann ein "Server" im Rapsberry laufen, der halt alles dann auf TCP umwandelt und sendet.
    Dazu braucht es dann auch einen verständigen "Clienten/Empfänger".

    Wie das W-Lan Dingens umgesetzt werden sollte, kann ich nicht Ansatzweise erklären, ist mir zu hoch...

    Daher kann ich nur empfehlen dem RPi beizubringen alles notwendige in der seriellen Ausgabe auszugeben.
    Dann ein eigenes Empfangsprogramm schreiben, was wiederum an die jeweiligen "echten Empfänger", in deinem beispiel Python, weiterleitet.

    Betrachte das als einen Schichtenkuchen.
    Erstmal das IoT-Dingens, dann das IoT-Versteher-Dingens, und dann der "Ich Verstehe nur Tastatureingabe-Dingens".

    IoT-Dingens = RaspberryPi
    IoT-Versteher-Dingens = Programm zum empfangen von serieller Kommunikation und Weiterleitung an andere Programme.

    RPi kann Seriell über USB automatisch, ist eingebaut, musst nur "etwas" Senden.

    Wie genau du die Schnittstelle benutzt und aktivierst, ist ausführlich im Internet zu finden. Zum beispiel YT.

    Wenn die die Arduino eigene Programmier IDE benutzt, dort ist doch das SerialMonitor Fenster genau das was die serielle ausgabe durch den USB Port macht.

    c.u. Joshi aus HaHa
    Danke an @Joshi du hast mir nochmal die nötige Motivation gegeben an dem Projekt weiter zu arbeiten. Wollte eigentlich schon aufgeben.

    Dieser Guide auf Github hat mir sehr weitergeholfen.

    Auf jeden Fall habe ich es nun geschafft dies ist mein Programm auf Windows (Das Programm empfängt Daten und sendet auch welche):
    (Bitte beachtet das der Code temporär ist! Man kann ihn noch sauberer schreiben.)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO.Ports
    3. Public Class Form1
    4. Private sSerialPort As New SerialPort
    5. #Region " Functions "
    6. Private Sub ReloadPorts(Optional ByVal ShowListAfterRefresh As Boolean = True)
    7. Try
    8. AllPorts_cbox.Items.Clear()
    9. Dim myPort As String() = IO.Ports.SerialPort.GetPortNames()
    10. AllPorts_cbox.Items.AddRange(myPort)
    11. AllPorts_cbox.DroppedDown = ShowListAfterRefresh
    12. Catch ex As Exception
    13. MessageBox.Show(ex.Message, "Error while refreshing list")
    14. End Try
    15. End Sub
    16. Private Async Sub sendData(ByVal input As String)
    17. If sSerialPort.IsOpen Then ' Checks if sSerialPort is open
    18. sSerialPort.Write(input) ' Send data
    19. Await Task.Delay(100) ' Wait 100 milliseconds
    20. End If
    21. End Sub
    22. #End Region
    23. #Region " Timer "
    24. Private Sub GetData_tmr_Tick(sender As Object, e As EventArgs) Handles GetData_tmr.Tick
    25. If sSerialPort.IsOpen Then ' Checks if sSerialPort is open
    26. Dim rData As String = sSerialPort.ReadExisting ' Read data in to variable
    27. If Not String.IsNullOrWhiteSpace(rData) Then ' Prevents from adding whitespace into listbox
    28. data_lb.Items.Add(rData)
    29. End If
    30. End If
    31. End Sub
    32. #End Region
    33. Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    34. If sSerialPort.IsOpen Then ' Close sSerialPort if it is still open
    35. sSerialPort.Close()
    36. End If
    37. End Sub
    38. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    39. ReloadPorts(False) ' Loads all available ports in list
    40. End Sub
    41. Private Sub ScanForPorts_btn_Click(sender As Object, e As EventArgs) Handles ScanForPorts_btn.Click
    42. ReloadPorts() ' Refresh Port list
    43. End Sub
    44. Private Sub connect_btn_Click(sender As Object, e As EventArgs) Handles connect_btn.Click
    45. Try
    46. sSerialPort.PortName = AllPorts_cbox.SelectedItem.ToString ' Set port from list
    47. sSerialPort.BaudRate = CInt(BaudRate_cbox.SelectedItem.ToString) ' Set baudrate from list
    48. sSerialPort.Open() ' Opens sSerialPort
    49. If sSerialPort.IsOpen Then ' Checks if sSerialPort is open
    50. GetData_tmr.Start() ' Start GetData_tmr
    51. MessageBox.Show("Connected!")
    52. Else
    53. MessageBox.Show("Unknown error while connecting.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
    54. End If
    55. Catch ex As Exception
    56. MessageBox.Show(ex.Message, "Error while connecting", MessageBoxButtons.OK, MessageBoxIcon.Error)
    57. End Try
    58. End Sub
    59. Private Sub disconnect_btn_Click(sender As Object, e As EventArgs) Handles disconnect_btn.Click
    60. Try
    61. GetData_tmr.Stop() ' Stop GetData_tmr
    62. data_lb.Items.Clear() ' Clears list
    63. sSerialPort.Close() ' Close sSerialPort
    64. If Not sSerialPort.IsOpen Then ' Checks if sSerialPort is not open
    65. MessageBox.Show("Disconnected!")
    66. Else
    67. MessageBox.Show("Unknown error while disconnecting.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
    68. End If
    69. Catch ex As Exception
    70. MessageBox.Show(ex.Message, "Error while disconnecting", MessageBoxButtons.OK, MessageBoxIcon.Error)
    71. End Try
    72. End Sub
    73. Private Sub Send_btn_Click(sender As Object, e As EventArgs) Handles Send_btn.Click
    74. Try
    75. If sSerialPort.IsOpen Then ' Checks if sSerialPort is open
    76. If String.IsNullOrWhiteSpace(input_txtbox.Text) Then
    77. Select Case MessageBox.Show("Do you want to send a whitespace?", "Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
    78. Case DialogResult.Yes
    79. sendData(input_txtbox.Text) ' Send data sub
    80. End Select
    81. Else
    82. sendData(input_txtbox.Text) ' Send data sub
    83. End If
    84. Else
    85. MessageBox.Show("You need to be connected with a serial port from the list above.")
    86. End If
    87. Catch ex As Exception
    88. MessageBox.Show(ex.Message, "Error while sending data", MessageBoxButtons.OK, MessageBoxIcon.Error)
    89. End Try
    90. End Sub
    91. Private Sub ClearLog_btn_Click(sender As Object, e As EventArgs) Handles ClearLog_btn.Click
    92. data_lb.Items.Clear() ' Just clears the log listbox
    93. End Sub
    94. End Class



    Temporärer Python 3 read code
    Spoiler anzeigen

    Quellcode

    1. #!/usr/bin/env python
    2. import time
    3. import serial
    4. ser = serial.Serial(
    5. port='/dev/ttyGS0',
    6. baudrate = 115200,
    7. parity=serial.PARITY_NONE,
    8. stopbits=serial.STOPBITS_ONE,
    9. bytesize=serial.EIGHTBITS,
    10. timeout=0.2
    11. )
    12. while 1:
    13. print(ser.readline())



    Vom PI zum PC zurück geht das auch sehr einfach:
    Spoiler anzeigen

    Quellcode

    1. #!/usr/bin/env python
    2. import time
    3. import serial
    4. ser = serial.Serial(
    5. port='/dev/ttyGS0',
    6. baudrate = 115200,
    7. parity=serial.PARITY_NONE,
    8. stopbits=serial.STOPBITS_ONE,
    9. bytesize=serial.EIGHTBITS,
    10. timeout=0.2
    11. )
    12. while 2:
    13. ser.write(str("Hier dein String").encode()) #Dont forget to encode the string when sending



    Das ganze wurde auf einem Raspberry Pi Zero WH getestet, wenn es auf einem Raspberry Pi 1/2/3/4 laufen soll, dann muss der python Code etwas umgeschrieben werden.
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!

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

    Es war mir eine Ehre.

    Chapou.

    Alle Elemente der Seriellen-Kommunikation scheinen abgedeckt zu sein.

    Hast wohl ´n händchen für Programmieren, wa?

    Hmmm... müsste eigentlich so heissen: Hast wohl Fingrespitzchen fürs Programmieren. :thumbsup:

    Ach, was weiss ich schon über´s Progammieren oder Anatomie?!

    Ich gehe mal nachher zu gitte mal ein wenig Huben!

    Merke wohl!
    Der Programmierer, ist oft am Verzagen, aber tapfer im Debuggen.
    So wird er mit Laufzeit belohnt, und der Anerkennung ihm oft fremder Benutzer!

    c.u. Joshi