Serial Port - Data Received

  • VB.NET

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

    Serial Port - Data Received

    Hallo,

    wie kann ich mir die Empfangenen Daten über SerialPort1_DataReceived in einer Textbox anzeigen lassen?

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2.  
    3. ' Empfangen der Daten
    4. Dim input As String
    5. input = SerialPort1.ReadLine
    6. MsgBox(input)
    7. '## ab hier habe ich Probleme...
    8. Textbox1.Text = input.tostring
    9. End Sub


    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Hi, also es kommt der folgende Fehler:

    InvalidOperatingException wurde nicht behandelt

    Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement TextBox1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.

    In der MsgBox kann ich mir das Ergebnis anschauen. Ich bekomme das Ergebnis nur nicht in eine TextBox. Da tritt der oben genannte Fehler auf.

    IF0 schrieb:

    VB.NET-Quellcode

    1. input = SerialPort1.ReadLine
    Wenn keine Zeile da ist, kannst Du keine lesen.
    Mach mal

    VB.NET-Quellcode

    1. input = SerialPort1.ReadExisting
    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!
    Es gab hier im Forum schon mal das Problem!
    Einfach mal diesen Beitrag durchschauen: Klick

    Den der in dem Beitrag verlinkt ist auch anschauen

    PS: Es war übrigens der erste Beitrag wenn ich deinen Fehler in Google eingebe ...
    Gruß K4RTOFF3L

    Das Problem zu erkennen ist wichtiger, als die Lösung zu erkennen, denn die genaue Darstellung des Problems führt zur Lösung. - Albert Einstein
    Danke für die Infos.

    @RodFromGermany: Hatte ich ausprobiert leider tritt der selbe Fehler auf.
    @K4RTOFF3L: Danke, hatte ich auch schon gesehen, bin leider nicht so ganz mit klar gekommen. :whistling: ^^

    habe es jetzt wie folgt gelöst:

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. ReceivedText(SerialPort1.ReadExisting())
    3. End Sub
    4. Private Sub ReceivedText(ByVal [text] As String)
    5. 'Thread handling:
    6. If Me.TextBox1.InvokeRequired ThenDim x As New SetTextCallback(AddressOf ReceivedText)
    7. Me.Invoke(x, New Object() {(text)})
    8. Else
    9. TextBox1.Text &= [text]
    10. 'TextBox1 wird automatisch in einem anderen Sub Zurückgesetzt/Gelöscht. Dadurch ist immer der aktuelle Wert vorhanden.
    11. End If
    12. End Sub
    @IF0: Sorry, hab das in Deinem 1. Post überlesen.
    Mach es besser so:

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Me.Invoke(Sub() ReceivedText(SerialPort1.ReadExisting()))
    3. End Sub
    4. Private Sub ReceivedText(ByVal [text] As String)
    5. TextBox1.Text &= [text]
    6. End Sub
    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!
    Diese Kurzschreibweise ist voll in Ordnung, so lange man eine überschaubare Anzahl Aufrufe dort durchjagt. Wer jedoch auf jede Millisekunde Wert legt, sollte zuerst mit "InvokeRequired" prüfen, ehe er unnötige Kontextwechsel provoziert. Aber bei reinen Textausgaben wird wohl keine nennenswerte Anzahl zusammenkommen.
    An manchen Tagen gibt es zu allem Überfluss auch noch Ärger!

    Rainman schrieb:

    InvokeRequired
    Das SerialPort ist bei reiner Textübertragung erfahrungsgemäß der Flaschenhals.
    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!
    Hier hat sich ja noch ein wenig was getan :thumbup:

    Nach ausgiebigem Testen fand ich das Data Receive Event etwas "Überdimensioniert" für meine Anwendung...
    Habe nun eine Alternative eingeschlagen die meiner Meinung einfacher zu handhaben ist.



    VB.NET-Quellcode

    1. Imports System.Threading
    2. SerialPort1.WriteLine(Befehl)
    3. SerialPort1.ReadTimeout = 150
    4. Thread.Sleep(50)
    5. Antwort = (SerialPort1.ReadTo(Chr(13)))




    Danke für Eure Unterstützung! Ihr seid Klasse :thumbsup:

    Jetzt brauch ich nur noch jemand, der/die sich mit Excelzugriff auskennt :whistling:

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