Letzte Zeile der mehrzeiligen Datenübermittlung verwenden

  • VB.NET

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

    Letzte Zeile der mehrzeiligen Datenübermittlung verwenden

    Hallo alle zusammen,

    ich lese einen Com-Port aus. Über den ComPort werden in unregelmäßigen Abständen Daten versendet. Diese Daten haben folgendes Format:
    Spoiler anzeigen


    12:32 31.05.2013
    Warnung
    Datei "xxx" kann nicht ausgelesen werden.

    12:32 31.05.2013
    Fehler
    Eis ist bereits geschmolzen


    Den Text in meiner Textbox angezeigt zu bekommen ist kein Problem (s.u.), dafür reicht das ReadExisting auch aus.
    Mein Problem ist folgendes:
    Ich möchte die Daten nicht nur visuell darstellen, sondern auch weiterverarbeiten.
    Dabei interessiert mich nur die letzte Zeile der jeweiligen Meldung.
    Und genau hier hängt es. Wie erfahre ich, dass die Übermittlung "abgeschlossen" ist?
    Mein Ansatz war dazu, dass ich BytesToRead() nutze, um zu überprüfen, ob der Buffer leer ist.
    Das bringt natürlich erst einmal nichts, da ich mit ReadExisting() arbeite und dann immer "stückchenweise" den Buffer leere.
    Zudem ist ReadExisting() eine schlechte Lösung, wenn ich mir die Dokumentation zur Funktion so durchlese.
    Allerdings fehlt mir gerade das Verständnis, wie ich mit Read() oder mit ReadLine() arbeiten kann, da ich dann nicht mehr auf das DataReceived-Event zugreifen kann und meine Anwendung ja wissen muss, wann etwas neues eingeht.

    Kommen wir also zu meiner Frage: Wie kann ich ohne DataReceived arbeiten, so dass meine Anwendung trotzdem erkennt wenn eine neue Meldung übertragen wird? Sie muss ja durchgehend quasi als WatchDog arbeiten, da immer "mal" wieder Meldungen ankommen.

    Freue mich sehr über eure Rückmeldungen!
    Gruß, Florian


    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(ByVal sender As 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. If Me.rtbReceived.InvokeRequired Then
    6. Dim x As New SetTextCallback(AddressOf ReceivedText)
    7. Me.Invoke(x, New Object() {(text)})
    8. Else
    9. Me.rtbReceived.Text &= [text]
    10. End If
    11. End Sub
    Willkommen im Forum. :thumbup:

    rarios schrieb:

    Wie kann ich ohne DataReceived arbeiten
    Wozu soll das gut sein?
    Lies den Text ein, häng ihn an einen Buffer hinten dran, arbeite den Buffer fon vorn ab.
    Erkenne die 3-zeilige Struktur, schmeiß die beiden Un-Zeilen weg, bearbeite die dritte und feddich.
    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 schrieb:

    Lies den Text ein, häng ihn an einen Buffer hinten dran, arbeite den Buffer fon vorn ab.
    Erkenne die 3-zeilige Struktur, schmeiß die beiden Un-Zeilen weg, bearbeite die dritte und feddich.
    Ja das war meine Idee. Nur leider fehlt mir der Ansatz, wann erkannt wird ob noch weitere "Teile" fehlen / übertragen werden.
    Sonst würde ich die jeweiligen empfangenen Bruchteile in eine String-Variable ( += ) schreiben.
    So wie ich es verstanden habe wird das DataReceived jedes Mal ausgeführt wenn etwas ankommt.
    Dann lese ich per ReadExisting diesen Bruchteil in eine String-Variable.
    Nur zu diesem Zeitpunkt ist der Empfangspuffer doch leer, also keine Chance per BytesToRead() zu ermitteln ob noch etwas übertragen wird. Oder habe ich hier einen Denkfehler?

    rarios schrieb:

    Sonst würde ich die jeweiligen empfangenen Bruchteile in eine String-Variable ( += ) schreiben.
    Genau so, nur mit &=.
    Dann schneide von vorn ganze Zeilen ab: IndexOf(Envionment.NewLine) (nicht Split() !!!; das/die Trennzeichen, die Deine Gegenstelle sendet) pack sie in eine List(Of String) und wenn 3 ganze Zeilen da sind, verarbeitest Du sie und schmeißt sie aus der List raus.
    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!