Serial-Receive Problem (Puffer erforderlich?)

  • VB.NET

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

    Serial-Receive Problem (Puffer erforderlich?)

    Hallo, ich nochmal...

    Folgendes: Ich empfange von einem Mikrocontroller Daten, die ich in einer einfachen TextBox darstellen möchte.

    Hierbei sollen Daten ankommen, die für zwei Zeilen bestimmt sind.

    Nun kommen vom Mikrocontroller immer 4 Pakete an, 2 pro Zeile.
    Teil 1 der Daten, die in Zeile 1 sollen, beginnt immer mit "01 a1". Teil 2 der Daten für Zeile 1 beginnt mit "01 a2" -> beide Datenpakete zusammen sollen dann in Zeile 1 der Textbox, und ergeben dann Sinn.
    Nun folgen die Daten für Zeile 2... hier beginnt Teil 1 mit "02 a3", und Teil 2 mit "02 a4". Diese beiden Datenpakete sollen dann in Zeile 2. Alle Pakete enden immer mit einer 09. Nun ist es eben bei RS232 so, dass manchmal am zweiten Teil der Daten für Zeile 1 auch noch die Hälfte der ersten Daten für Zeile 2 hängen etc.

    Was ich also brauche:
    Alles, was mit "01 a1" beginnt, kommt an den Anfang von der ersten Zeile meiner Textbox, und alles was mit "02 a2" beginnt, kommt in der gleichen Zeile hintendran, sonst habe ich nur halbe Wörter dastehen.
    Das gleiche dann mit Zeile 2 ("02 a3" erster Teil Zeile 2, "02 a4" zweiter Zeil Zeile 2).

    Diese Daten werden derzeit jede Sekunde aktualisiert. Nun sollen die Daten in beiden Zeilen erst aktualisiert weden, wenn beide Pakete angekommen sind. Sonst sieht der Nutzer für einen Moment dann nur ein halbes Wort etc.

    Hat jemand vielleicht ein Anfängerfreundliches Beispiel (oder sogar ein Beispielprojekt), wie man das realisieren könnte?

    Aktuell nutze ich ReadExisting, aber da springt die TextBox dann immer zwischen Teilen der Wörter etc.

    Soll am Ende so aussehen:
    Zeile 1: [Erstes Datenpaket Zeile1][Zweites Datenpaket Zeile 1]
    Zeile 2: [Erstes Datenpaket Zeile2][Zweites Datenpaket Zeile 2]

    Danke schonmal
    @AWS Du hast hier zwei Teilprobleme, die Du tunlich nicht vermischen solltest.
    Einmal kommen von einem MC Daten in Teilmengen, die Du empfangen und formatieren musst (Entfernen von Daten-Kennungs-Zeichen und so).
    Das andere ist, diese Teilmengen so zusammenzusetzen, dass sie ordentlich lesbar sind.
    Frage:
    Haben die Daten ein definiertes Zeilenende?
    Wenn ja, kannst Du dieses der Property SerialPort.NewLine zuweisen und dann mit SerialPort.ReadLine() eine komplette Teilmenge empfangen.
    Wenn nicht, pack die Daten in einen hinreichend großen Ring-Buffer.
    ====
    Sinnvoll ist es, alle eingehenden Daten zu puffern und erst, wenn eine vollständige Bildschirm-Zeile empfangen wurde, diese zusammenzusetzen und darzustellen.
    Wenn Du immer zwei Zeilen auf ein Mal darstellen willst, warte, bis diese Daten empfangen wurden.
    ====
    Falls Du mit einem Ring-Buffer arbeitest:
    Du arbeitest mit zwei Indizes: Einem Schreib-Index und einem Lese-Index.
    Wenn Du Daten empfängst, überträgst Du sie zeichenweise in den Buffer. Ist das Buffer-Ende erreicht, fängst Du bei 0 wiedere an.
    Nach jedem Empfang überprüfst Du, ob eine vollständige Ausgabe-Zeile (oder zwei) vorhanden ist.
    Wenn nein, warte auf die nächsten Empfangsdaten.
    Wenn ja, übergib die Zeile per Event an die GUI und setz den Lese-Index auf das erste nicht zur Ausgabe-Zeile gehörende Zeichen.
    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!
    [quote Haben die Daten ein definiertes Zeilenende?[/quote]

    Jein... kein Zeilenende, nur eine "Paketkennzeichnung" -> erstes Datenpaket für Zeile eins beginnt mit 01 a1, das zweite mit 01 a2. Es enden leider alle Pakete mit 09, egal für welche Zeile.

    Wie ich das mit dem Puffer umsetzen könnte, weiß ich schon nicht.
    Wenn ich rausgefunden habe, wie Buffer in VB funktionieren, muss ich ihm ja irgendwie sagen, wo die neue Zeile beginnen soll bzw. wenn die Daten für Zeile 1 vollständig sind, aber da ja Pakete 1 und 2 für die erste Zeile beide mit 09 enden...wie setze ich das um? EDIT "02 a3 -> neue Zeile" wäre wohl kein Problem.

    Das entfernen der Kennzeichen (01 a1, , etc) und die 09 am Ende jedes Paketes, habe ich aktuell mit "CharaktersAllowed = (...)" umgesetzt, da ich nur A-Z und 0-9 brauche. Aber das ist wahrscheinlich auch nicht die "feine Art"
    MfG
    @AWS
    Dein Problem ist das Du die Daten nicht von der Anzeige getrennt hälst.
    Dafür gibt es auch einen Fachbegriff, habe ich aber gerade nicht parat.
    Also bau eine Zwischenschicht in Form einer Klasse ein.
    Diese wird von der Schnittstelle befüllt und verarbeitet/bereitet die Daten auf.
    Wenn diese Klasse einen kompletten Satz hat, Event feuern und anzeigen lassen wo immer und wie immer du möchtest.
    Damit lösen sich alle deine Probleme in Luft auf und dieses Verfahren macht deinen Code besser wart- und erweiterbar.

    AWS schrieb:

    Es enden leider alle Pakete mit 09
    Dann probier das mal als Zeilenende.
    Zeile im Sinne von SerialPort ist hier was anderes als Zeilenende im Sinne von AWS ;)
    Puffer:
    Zunächst mal: Arbeitest Du mit Char oder mit Byte?

    VB.NET-Quellcode

    1. Dim array(1023) As Byte ' oder Char
    2. Dim IndexWrite As Integer = 0
    3. Dim IndexRead As Integer = 0
    4. ' ...
    5. ' Jedes Byte oder Char einzeln eintragen
    6. Sub WriteByte(Byte by)
    7. array(IndexWrite) = by
    8. IndexWrite = (IndexWrite + 1) Mod 1024
    9. End Sub
    Das Auslesen bekommst Du denke ich alleine hin.
    ====
    Wenn das mit dem zeilenweisen Lesen klappt, musst Du die Zeilen nur einer List(Of String) anhängen und immer, wenn eine Anzeige-Einheit komplett abgearbeitet ist, entfernst Du die Zeilen aus der Liste.
    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!

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