Hallo Zusammen, ich habe mal eine Frage bzw. ein Problemchen... Ich bekomme von einem Device über die uart eine "Bytewurst" wo mit einer 0x00 oder 0x44 gestartet wird und dann folgen daraufhin die Daten (eigentlich variable Länge) Nun möchte ich diese Daten mit einem µC einlesen und zum Beispiel auf die Bytefolge 0x00 0xFF 0x00 0x01 oder 0x44 0x04 0x02 0x00 0x01 parsen... Wie macht man sowas am elegantesten, wenn man keine Terminierung von dem device bekommt? Ich könnte notfalls grob von ausgehen, dass nach der Synchornisierung (0x00 oder 0x44) drei oder vier bytes folgen, aber leider ist mitten in der Message auch eine 0x00 oder die 0x44 enthalten, die allerdings nicht zur synchronisierung dienen, sondern zu den nutzdaten gehören... vielleicht kann mir jemand einen Denkanstoss geben, wie man sowas am elegantesten lösen könnte... die Daten kommen interruptgestuert am µC (atmega128) an, aber was dann? Vielen Dank und Gruß Spice
Puffer einrichten, der mindestens so viele Zeichen aufnehmen kann wie im Vergleichsstring enthalten sind. Mitzählen wieviele Zeichen im Puffer sind, falls genügend (= Anzahl Zeichen im Vergleichstring) dann zuletzt empfangenes Zeichen im Puffer mit dem letzten Zeichen im Vergleichsstring vergleichen. Wenn übereinstimmung vorletztes Zeichen etc. bis alle Zeichen übereinstimmen ansonsten Abbruch.
Spice schrieb: > Hallo Zusammen, > > ich habe mal eine Frage bzw. ein Problemchen... > Ich bekomme von einem Device über die uart eine "Bytewurst" wo mit einer > 0x00 oder 0x44 gestartet wird und dann folgen daraufhin die Daten > (eigentlich variable Länge) > Nun möchte ich diese Daten mit einem µC einlesen und zum Beispiel auf > die Bytefolge 0x00 0xFF 0x00 0x01 oder 0x44 0x04 0x02 0x00 0x01 > parsen... Wie macht man sowas am elegantesten, wenn man keine > Terminierung von dem device bekommt? Ich könnte notfalls grob von > ausgehen, dass nach der Synchornisierung (0x00 oder 0x44) drei oder vier > bytes folgen, aber leider ist mitten in der Message auch eine 0x00 oder > die 0x44 enthalten, die allerdings nicht zur synchronisierung dienen, > sondern zu den nutzdaten gehören... Hä? Dann ist das auch keien zuverlässige Synchronisierung. > vielleicht kann mir jemand einen Denkanstoss geben, wie man sowas am > elegantesten lösen könnte... die Daten kommen interruptgestuert am µC > (atmega128) an, aber was dann? Das würde ich lösen, indem ich mir für jede zu prüfende Sequenz merke, wieviele Bytes schon überein gestimmt haben. Kommt ein neues Byte rein, so werden alle 'Vorgabesequenzen' abgeklappert und nachgesehen, ob das Byte immer noch dazu passt. Wenn ja, wird der Korrekt-Zähler um 1 erhöht, wenn nein wird die Sequenz als 'definitiv nicht erkannt' markiert. Stimmt der Korrekt-Zähler mit der Sequenzlänge überein, dann ist damit auch die Sequenz als gültig erkannt. D.h. nicht erst die komplette Sequenz einlesen, sondern bei jedem Byte prüfen, ob und zu welcher Sequenz es noch passen kann. Mit dem nächsten erkannten Framestart/Synchronisierung (wie auch immer du das machen willst/musst), wird dann alles wieder in den Grundzustand gesetzt: 0 Bytes erkannt und alle Sequenz sind wieder möglich.
Vermutlich ist zwischen den Paketen etwas Zeit. Wenn das so ist: - Warten bis ein 0x00 oder 0x44 reinkommt - Timer loslaufen lassen - jedes empfangene Zeichen in einen Puffer kopieren und Timer auf 0 zurücksetzten - Wenn Timer einen bestimmten Wert überschreitet, Empfangenes auslesen und wieder oben anfangen Stefan
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.