Forum: Mikrocontroller und Digitale Elektronik String ohne Terminierung (char array) einlesen und parsen


von Spice (Gast)


Lesenswert?

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

von Helfer (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.