Problem beim Lesen von seriellen Daten

  • VB.NET
  • .NET (FX) 4.0

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Problem beim Lesen von seriellen Daten

    Moin,

    Im DataReceived-Event des SerialPort möchte ich via ReadLine bis zum NewLine-Wert jeweils Zeile für Zeile Serielle Daten auslesen.
    Die Daten werden empfangen, das Event löst aus. via MsgBox kann ich mir die Daten auch ausgeben lassen.
    Ich möchte die Daten aber in einer TextBox auf einer anderen Form loggen, aber aus irgendeinem Grund passiert rein gar nichts.

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Dim fSC As New SerialControl
    3. fSC.TextBox1.Text += SerialPort1.ReadLine()
    4. End Sub


    Das bewirkt aus irgendeinem Grund nichts. Es wird nichts hinzugefügt.

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Dim fSC As New SerialControl
    3. Dim vStr As String = SerialPort1.ReadLine()
    4. fSC.TextBox1.Text += vStr
    5. End Sub


    Wenn ich einen BP setze und nach dem Inhalt von vStr schaue, enthält dieser bspw.

    Quellcode

    1. "* MOS09 *" & vbCr

    Das vbCr habe ich auch schon gelöscht, keine Wirkung.

    Hat jemand eine Idee, wie ich den Text da jetzt rein bekomme? via MsgBox funktioniert die Ausgabe ja.

    VG
    @Neoner
    1. Du erzeugst und beschreibst ein Control, das nirgendwo angezeigt wird.
    2. das SerialPort läuft in einem anderen Thread.
    Verwende z.B. eine TextBox in der Form, in der das SerialPort liegt:

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Dim vStr As String = SerialPort1.ReadLine()
    3. Me.BeginInvoke(Sub() SetText(vStr))
    4. End Sub
    5. Private Sub SetText(txt As String)
    6. Me.TextBox1.Text &= txt
    7. 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!
    Volltreffer!
    Vielen Dank!

    /E:
    Ich muss mich damit mal näher außeinander setzen, der Code funktioniert zwar, aber ich verstehe nicht so ganz wieso bzw. was das BeginInvoke bewirkt.

    Neoner schrieb:

    BeginInvoke
    sorgt dafür, dass der da aufgerufene Code im Thread von Me ausgeführt wird, und zwar unmittelbar nach Beendigung der Prozedur SerialPort1_DataReceived(...), im Gegensatz zu Invoke(), da wird der Code sofort ausgeführt.
    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!