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
ich lese einen Com-Port aus. Über den ComPort werden in unregelmäßigen Abständen Daten versendet. Diese Daten haben folgendes Format:
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
- Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
- ReceivedText(SerialPort1.ReadExisting())
- End Sub
- Private Sub ReceivedText(ByVal [text] As String)
- If Me.rtbReceived.InvokeRequired Then
- Dim x As New SetTextCallback(AddressOf ReceivedText)
- Me.Invoke(x, New Object() {(text)})
- Else
- Me.rtbReceived.Text &= [text]
- End If
- End Sub