Forum: Compiler & IDEs Über ser. Schnittstelle eingehende Zeichenkette(n) vergleichen, doch wie?


von Günter H. (guenterh)


Lesenswert?

Hallo,

ich bin noch recht am Anfang mich in C und die Programmierung des AVR 
einzuarbeiten und habe ein konkretes Problem bei dem ich nicht weiter 
komme.

Sachverhalt:
Ich bekomme über die serielle Schnittstelle Daten (ca. alle 2 Sekunden 
so 250 Byte). In dem Datentelegramm möchte ich nun bestimmte Stellen 
herausfiltern auf die nähmlich die für mich maßgeblichen Werte stehen.

Meine Idee war eine Zeichenkette die ich auffülle dann mit dem gesuchten 
Muster vergleiche, beim nächsten Byte dann das ganze ein Byte nach links 
schiebe, wieder vergleiche usw....

Geht das überhaupt so? Wie würdet ihr das machen?

Hab schon C Erfahrung jedoch ist schon ne Zeit her (Microsoft Quick C). 
Wer das kennt weiß wie lange das her ist. Natürlich habe ich schon 
gesucht doch wenn ich weiter gekommen wäre hätte ich die Frage sicher 
nicht hier gestellt.

Grüße
Günter

von Daniel A. (daniel-a)


Lesenswert?

Günter H. schrieb:
> Ich bekomme über die serielle Schnittstelle Daten (ca. alle 2 Sekunden
> so 250 Byte). In dem Datentelegramm möchte ich nun bestimmte Stellen
> herausfiltern auf die nähmlich die für mich maßgeblichen Werte stehen.

Wie sieht dieses "Datentelegramm" aus?
Welches protokoll/ein beispiel?

> Meine Idee war eine Zeichenkette die ich auffülle

Wie ist das gemeint? Werden die ankommenden daten in ein char array 
eingelesen? Wird der speicher dynamisch reserviert?

> dann mit dem gesuchten
> Muster vergleiche, beim nächsten Byte dann das ganze ein Byte nach links
> schiebe, wieder vergleiche usw....
>
> Geht das überhaupt so? Wie würdet ihr das machen?

Ja.
Den umweg mit der zeichenkette kann man vileicht auslassen. Wenn es um 
das parsen von daten geht empfehle ich eine state maschine, welche immer 
je ein zeichen parst.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Günter H. schrieb:
> beim nächsten Byte dann das ganze ein Byte nach links
> schiebe

Das ist ... sehr ineffizient. Starte doch einfach die 
Vergleichsoperation nicht am ersten, sondern am zweiten, und dann amn 
dritten etc. Byte.

Wenn Du aber von "Datentelegramm" redest, hat das einen irgendwie 
strukturierten Aufbau?

--

Quick-C kenne ich. War schrecklich. Habe dann Turbo C 2.0 mit den 
exzellenten deutschsprachigen Handbüchern von Arne Schäpers in die Hände 
bekommen ...

von Günter H. (guenterh)


Lesenswert?

Daniel A. schrieb:
> Den umweg mit der zeichenkette kann man vileicht auslassen. Wenn es um
> das parsen von daten geht empfehle ich eine state maschine, welche immer
> je ein zeichen parst.

Hallo Daniel,
vielleicht erwähnte ich schon das meine C-Kenntnisse zum einen nie 
excellent waren und das was da ist muss ich in den Tiefen meiner 
Hirnwindungen wieder aktivieren. Deshalb entschuldige die blöde Frage 
doch: Der Begrifft state maschine ist mir neu. Magst du das näher 
erklären?

Gruß. Günter

von Günter H. (guenterh)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Das ist ... sehr ineffizient. Starte doch einfach die
> Vergleichsoperation nicht am ersten, sondern am zweiten, und dann amn
> dritten etc. Byte.

Wollte das auch so machen doch irgendiwe weiß ich nicht wie ich dass 
effizient aufbauen/programmieren soll.

>
> Wenn Du aber von "Datentelegramm" redest, hat das einen irgendwie
> strukturierten Aufbau?

Hat es, doch ganz ehrlich blicke ich das nur bedingt. Es geht um die 
Ausgabe von bestimmten Stromzählern in SML (bitcodiert)

Beispiel:
Startsequenz 1B 1B 1B 1B
Protokollvers. 01 01 01 01

Dann kommt einiges uninteressantes gefolgt von z.B.
77 07 10 01 08 00 FF danach eine festgelegte Anzahl Bytes gefolgt von 
den relevanten Daten.

Also zu Quick-C muss ich sagen dass die Bücher die im Paket von 
Microsoft enthalten waren, wirklich gut waren oder war ich damals 
einfach gescheiter als heute. Die waren im übrigen auch alle in deutsch. 
Hab dann eine Zeit Pause gemacht und mir damals den C++ Builder 
zugelegt.

Gruß
Günter

von Günter H. (guenterh)


Lesenswert?

Hallo,

also wenn ich so sehe wieviel Antworten andere mit Ihren Beiträgen 
bekommen frage ich mich ob ich vielleicht meine Fragen im falschen Forum 
stelle oder vielleicht im falschen Bereich. Natürlich ist es wichtig zu 
diskutieren ob dem einen jetzt Target oder Eagle besser gefällt.

Ich finde ein Forum eine hervorragende Möglichkeit Antworten auf Fragen 
zu bekommen und bedaure es sehr wenn ein Forum mehr für den Austausch 
persönlicher Vorlieben und Meinungen genutzt wird.

So was bin ich von anderen Foren (z.B. zu Motorrädern) nicht gewohnt.

Ich finde das einfach schade.

von Amateur (Gast)


Lesenswert?

So ein Beitrag geht üblicherweise in zwei Richtungen.
Da sind zum einen Deine Fragen und
zum anderen Fragen derer die Dir helfen wollen.

Weden aber, so einfache Fragen wie:

>Wie sieht dieses "Datentelegramm" aus?
>Welches protokoll/ein beispiel?

... und ähnliches nicht beantwortet, so zwingst Du die Helfer zum Raten 
oder zum herbeiholen der Glaskugel.

Da kann schon mal der St. Nimmerleinstag dazwischenkommen.

Also: Problem genau beschreiben (möglichst mit Beispielen) oder sein 
lassen.

Ich unterstelle mal, dass Dir mit irgendwelchem Sermon nicht gedient 
ist.

von Günter H. (guenterh)


Lesenswert?

Hallo,

ich gehe jetzt mal davon aus das du den dritten Beitrag nicht angeschaut 
hast. SML ist das Protokoll und ein Beispiel habe ich auch eingebracht.

Hier die Definition des Protokolls:
http://www.vde.com/de/fnn/arbeitsgebiete/messwesen/Sym2/Infomaterial/Documents/SML_081112_103.pdf

Würde ich damit selbst weiterkommen würde ich hier vermutlich keine 
Fragen stellen. Jeder fängt mal an und wenn er niemand findet der ihm 
ein wenig hilft dann hört er es bald wieder auf (Annahme des 
Verfassers).

von Karl H. (kbuchegg)


Lesenswert?

Dieses Dokument laesst immer noch eine Menge moeglicher Alternativen 
offen.
Den XML Bereich habich mir nicht naeher angesehen, aber abgesehen davon 
kommen da ueberhaupt keine Strings vor.
Das ganze laesst sich nach einem zugegebenermassen nur kurzem Ueberflug 
der Doku, auf die simple 'Formel' reduzieren: Ueber die serielle 
Schnittstelle kommt 1 Byte rein, was soll damit (abhaengig von dem was 
vorher empfangen wurde) geschehen?
Du kannst dir Variablen machen, in denen du dir den aktuellen Zustand 
der Uebertragung merken kannst, um zu entscheiden was mit dem naechsten 
Byte zu geschehen hat bzw. die den aktuellen Zustand modifizieren.
Am Anfang ist dein Empfangscode im Zustand 'keine Nachricht' und der 
Escape Zaehler ist auf 0. Das naechste Byte wird von der Seriellen 
geholt, wenn eines da ist. Ist es ein 0x1B dann wird der Escape Zaehler 
um 1 erhoeht. Ist es kein 0x1B dann wird der Zaehler auf 0 gesetzt. 
Erreicht der Zaehler auf die Art den Wert 4, dann wurde offenbar der 
Beginn einer Nachricht gefunden und der Empfangscode wechselt in den 
Zustand 'in einer Nachricht'.
Und so geht das eben dahin. 1 Byte wird von der Seriellen geholt und 
abhaengig vom Zustand und/oder irgendwelchen Zaehlern oder anderen 
Variablen wird entschieden, was mit dem Byte geschehen soll, bzw wie die 
Weichen fuer die naechsten Bytes zu stellen sind.

Mal dir halt mal ein paar komplette Nachrichten auf, so wie du sie vom 
Geraet kriegst und entschluessle die Nachricht komplett. Da kriegst du 
dann ganz schnell ein Gefuehl dafuer, welche Bytes wie das weitere 
Vorgehen beim Empfang bzw. In der Dekodierung steuern.
Aber eines steht fest: mit Strings bzw Stringverarbeitung hat das alles 
nichts zu tun.

: Bearbeitet durch User
von Günter H. (guenterh)


Lesenswert?

Hallo Karl Heinz,

vielen Dank für den Ansatz. So ungefähr dachte ich mir das auch. Ich 
habe mir das mal aufgezeichnet was da reinkommt und mir die Zeit 
genommen die Muster (Bytefolgen) zu kennzeichnen und werde mich jetzt 
daran machen die gewünschten werte auszulesen. Sicher wird das eine 
Lösung bei der sich ein Profi die Hände über dem Kopf zusammenschlägt 
doch besser erst mal eine Lösung die funktioniert dann kann ich immer 
noch optimieren. So macht das schließlich Microsoft schon bald 30 Jahre 
sehr erfolgreich ;-)

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.