Forum: Mikrocontroller und Digitale Elektronik AT Command Interpreter, welches konzept?


von C. H. (hedie)


Lesenswert?

Hallo zusammen

Ich möchte mit meinem GSM Modem kommunizieren.

Es gibt einen Interrupt, welcher bei jedem Zeichen aktiv wird.


Früher habe ich immer Zeichen gesammelt, bis ein LineFeed kam und den 
enstandenen String mit einer Switch anweisung mehr oder weniger 
ausgewertet.

Dies lief auch mehr schlecht als recht.

Diesesmal möchte ich das ganze aber sauber lösen.

Wie geht man normalerweise an sowas ran?
Gibt es interpreter konzepte?

Danke schonmal!

von Ulrich F. (Gast)


Lesenswert?

>Gibt es interpreter konzepte?
Ich glaube du suchst das Zauberwort "Endlicher Automat"!

von C. H. (hedie)


Lesenswert?

Ulrich F. schrieb:
>>Gibt es interpreter konzepte?
> Ich glaube du suchst das Zauberwort "Endlicher Automat"!

Du meinst aber nicht ne Statemachine?

von C. H. (hedie)


Lesenswert?

Claudio Hediger schrieb:
> Ulrich F. schrieb:
>>>Gibt es interpreter konzepte?
>> Ich glaube du suchst das Zauberwort "Endlicher Automat"!
>
> Du meinst aber nicht ne Statemachine?

Soll ich die erhaltenen strings in einer statemachine abarbeiten?

von Possetitjel (Gast)


Lesenswert?

Ulrich F. schrieb:

>>Gibt es interpreter konzepte?
> Ich glaube du suchst das Zauberwort "Endlicher Automat"!

Sehr schön. Gefällt mir. Du bekommst den Sonderpreis für
Erhalt und Pflege der deutschen Muttersprache.

von Ulrich F. (Gast)


Lesenswert?

>Du meinst aber nicht ne Statemachine?
Doch, doch, das meinte ich schon.

Im allgemeinen werden Interpreter so gebaut.

>Sehr schön. Gefällt mir. Du bekommst den Sonderpreis für
>Erhalt und Pflege der deutschen Muttersprache.
Danke für die Blumen.

von Possetitjel (Gast)


Lesenswert?

Claudio Hediger schrieb:

> Ulrich F. schrieb:
>>>Gibt es interpreter konzepte?
>> Ich glaube du suchst das Zauberwort "Endlicher Automat"!
>
> Du meinst aber nicht ne Statemachine?

Was ist das für Pidgin-Englisch?

Damit der Begriff "Statemachine" einen Sinn bekommt, müsste
es eine Stateless-Machine geben, also eine Maschine mit
Null (!) Zuständen.
Eine reine Kombinatorik hat einen Zustand. Wie sieht bitte ein
digitaler Automat mit Null Zuständen aus?

"state machine" ist Schwachsinn. Das Ding heißt in Langform
" finite state machine" und ist als Gegenpol zur " infinite
state machine" (=Turing-Maschine etc) zu verstehen!

von C. H. (hedie)


Lesenswert?

Possetitjel schrieb im Beitrag #363145
> "state machine" ist Schwachsinn. Das Ding heißt in Langform
> " finite state machine" und ist als Gegenpol zur " infinite
> state machine" (=Turing-Maschine etc) zu verstehen!

state machine = zustands automat ;)

von chris (Gast)


Lesenswert?

Dies kommt sehr darauf an, wie du die Befehle structurierst.
Ansonsten, prinzipiell sind die Befehle Strings, welche du einen nach 
dem
anderen durcharbeitest.

von (prx) A. K. (prx)


Lesenswert?

Possetitjel schrieb:
> "state machine" ist Schwachsinn.

Hilft nichts, der Begriff "state machine" ist überaus verbreitet. Nicht 
jeder ist sprachlich so pingelig, erst recht nicht die Amis.

von Possetitjel (Gast)


Lesenswert?

Claudio Hediger schrieb:

> zustands automat ;)

"Zustands automat"? Benannt nach Johann Nepomuk Zustand?
Eulersche Formel - Mälzels Metronom - Zustands Automat?

Grrrr....

Bitte, Leute, tut doch wenigstens so, als ob Ihr Euch
bemühen würdet, Deutsch zu können...

von Claudio (Gast)


Lesenswert?

Possetitjel schrieb:
> Claudio Hediger schrieb:
> zustands automat ;)
>
> "Zustands automat"? Benannt nach Johann Nepomuk Zustand? Eulersche
> Formel - Mälzels Metronom - Zustands Automat?
> Grrrr....
> Bitte, Leute, tut doch wenigstens so, als ob Ihr Euch bemühen würdet,
> Deutsch zu können...

Ich ben äbe schwizer weisch ;)
Mir döffed schribe wiä mir möchted ;)

Es isch jo scho en pluspunkt das mir uf hochdütsch schribe...

Hoffe jemand kann das lesen

von (prx) A. K. (prx)


Lesenswert?


von Dödel (Gast)


Lesenswert?

Claudio schrieb:
> Hoffe jemand kann das lesen

Hä jo klar, dänk! Wobei bem ene Wallischer hetti ou Müeh...

von Dödel (Gast)


Lesenswert?

Dödel schrieb:
> Hä jo klar, dänk! Wobei bem ene Wallischer hetti ou Müeh...
                    ^^^^^
Grr... Die blödi Rächtschriibkorrektur funkt immer drii :-(

von Possetitjel (Gast)


Lesenswert?

A. K. schrieb:

> Hilft nichts, der Begriff "state machine" ist überaus
> verbreitet.

Das stimmt - aber das macht die Schlamperei nicht besser.
Stromspannung und kW/h sind auch überaus verbreitet... :)


> Nicht jeder ist sprachlich so pingelig, erst recht nicht
> die Amis.

Bist Du sicher, dass die Amis schuld sind?
In halbwegs offiziellen Schriftstücken (Buch, Uni-Skript etc.)
habe ich bisher immer korrekt "finite state machine" gelesen.
Erst das Programmierer-Pidgin macht dann "state machine" draus.

Aber Programmierer reden ja auch von einer Instanz, wenn sie
ein Exemplar meinen, oder dass die Daten gesamplet wurden...

Die Welt ist schlecht.

von (prx) A. K. (prx)


Lesenswert?

Possetitjel schrieb:
> Bist Du sicher, dass die Amis schuld sind?

Andersrum: Es sind die Deutschen, die für ihren Sucht nach sprachlicher 
Präzision berüchtigt sind. Dass man in Uni-Literatur präziser ist, als 
im allgemeinen Gebrauch, ist aber überall verbreitet.

von Max H. (hartl192)


Lesenswert?

Possetitjel schrieb:
> kW/h
Ist das die Beschleunigung der Leistung?

von Kugelblitz (Gast)


Lesenswert?


von Georg (Gast)


Lesenswert?

Max H. schrieb:
>> kW/h
> Ist das die Beschleunigung der Leistung?

Nein, das ist die völlig korrekte Masseinheit für den Zuwachs unserer 
Automotoren an durchschnittlicher Leistung - wurde gerade durch den 
400-PS-Golf wieder ein Stück nach oben getrieben. Handlicher wäre aber 
kW/Jahr.

Georg

von Possetitjel (Gast)


Lesenswert?

Claudio schrieb:

> Ich ben äbe schwizer weisch ;)
> Mir döffed schribe wiä mir möchted ;)

Naja, "dürfen" war jetzt nicht der Punkt...

Du darfst Dir auch den Bauch grün anpinseln und als Wiese
verpachten, wie man so sagt... :)


> Es isch jo scho en pluspunkt das mir uf hochdütsch schribe...

Au... so eine Vorlage.

Anfrage an Sender Jerewan: Ist es ein Zeichen des Fortschritts,
dass die Schweizer jetzt Hochdeutsch schreiben?

Antwort: Im Prinzip ja, aber erstens ist es nicht direkt ein
Fortschritt, und zweitens ist es nicht direkt...

SCNR

von Possetitjel (Gast)


Lesenswert?

A. K. schrieb:

> Es sind die Deutschen, die für ihren Sucht nach sprachlicher
> Präzision berüchtigt sind

Es ging mir nicht um "Sucht nach sprachlicher Präzision", sondern
darum, dass im Begriffspaar "finite state machine" / "infinite
state machine" das "finite" eine zentrale sinntragende Einheit
ist.

Das ist genauso, wie wenn Du im Deutschen vom "Strommotor" redest:

Häh?
Gleichstrommotor?
Wechselstrommotor?
Allstrommotor?
Drehstrommotor?

Die Lösung liegt, wie ich inzwischen herausgefunden zu haben glaube,
darin, dass "infinite state machine" im Englischen unüblich ist.
Das heißt dann anscheinend direkt "Turing machine". Das ist anders
als im Deutschen; wir haben in Automatentheorie von endlichen und
unendlichen Automaten geredet.

von (prx) A. K. (prx)


Lesenswert?

Ich wiederum kann mich nicht an den unendlichen Automaten erinnern, sehr 
wohl aber an die Turingmaschine.

von Possetitjel (Gast)


Lesenswert?

Vielleicht doch noch was zum Thema... :)

Claudio Hediger schrieb:

> Soll ich die erhaltenen strings in einer statemachine
> abarbeiten?

Ich habe Ulrich anders verstanden: Du hast ja offensichtlich
ASCII-Zeichen o.ä., die einzeln einlaufen. Erste Aufgabe
Deines Programmes ist, diese Einzelzeichen zu "Worten"
(Token) zusammenzufassen.
Für a priori bekannte Schlüsselworte ist das im Prinzip
einfach, weil man in einer Tabelle nachsehen oder einen
Entscheidungsbaum abarbeiten kann. Für Variablen, Zahlen
u.ä. ist das nicht ganz so trivial; da muss man das
"Bauprinzip" überprüfen, und das geht mit einem endlichen
Automaten... ähhh.... Entschuldigung: einer "finite state
machine" :)
Backus-Naur-Formen, Syntaxdiagramme, reguläre Ausdrücke
und endliche Automaten sind im Wesentlichen alles eine
Suppe, weil weitgehend ineinander umwandelbar.

Wenn Du die einzelnen "Worte" isoliert und die "Wortart"
bestimmt hast (lexikale Analyse), geht es darum, den "Sinn"
des ganzen "Satzes" zu prüfen bzw. zu verstehen (Syntax-
Analyse).

"awk" verwendet für alles ein "Pattern:Action"-Schema; das
ist nicht so weit von Deiner switch-Anweisung entfernt - nur
dass das Pattern ein regulärer Ausdruck sein kann (wenn mich
meine Erinnerung nicht trügt.)
Große Überschrift ist übrigens "Compilerbau"; vielleicht auch
noch "Theorie formaler Sprachen".

von Ulrich F. (Gast)


Lesenswert?

Hmm...

Zum einen:
Soweit bin ich noch gar nicht gegangen, bzw. soweit kann ich nicht 
denken.
Das einzige, was ich weiß/ahne, ist:
Es trudelt ein Datenstrom ein. Vermutlich ASCII Zeichen.
Es gibt einen Startpunkt der Kommunikation.
Ab und an sind LFs dazwischen.

Und da ist er schon, der einfachste endliche Automat.
Mit Zustandswechseln beim eintrudeln von LFs.

Wie es dann weiter geht, z.B. ob zwischen den LFs Kommandos und 
Parameter lauern, kann ich vermuten, mehr aber auch nicht. Der Begriff 
"Interpreter" deutet an, dass es in diese Richtung geht.



Zum anderen:
Ansonsten finde ich es hilfreich, wenn "wir" bei technischen 
Diskussionen ein gemeinsames Vokabular verwenden. Auch wenn der Begriff 
"state machine" evtl. nicht voll korrekt ist, habe ich ihn verstanden.

Ich selber versuche mich möglichst klar und eindeutig auszudrücken. Aber 
die Erfahrung lehrt, dass mir das nur eingeschränkt gelingt. Gerade in 
Foren, steckt doch jeder in seinem eigenen Kontext. Die Leute leben über 
die ganze Welt verteilt. Jeder hat seinen eigenen Tellerrand.

Es ist meines Erachtens nach voll in Ordnung, auf die fachlich korrekten 
Terme hinzuweisen. Aber es besteht dabei immer die Gefahr 
Nebenkriegsschauplätze zu eröffnen, welche vom eigentlichen Thema 
ablenken.
Oder schlimmer: Unangenehme Gefühle erzeugen/transportieren.
Konkret: Durch den "Streit" über die Begrifflichkeit, wird das Objekt 
der Begierde negativ belegt.

Oder von der anderen Seite betrachtet, jede fachliche Diskussion 
beinhaltet eine soziale Komponente.

von Claudio (Gast)


Lesenswert?

Possetitjel schrieb:
> Vielleicht doch noch was zum Thema... :)
>
> Claudio Hediger schrieb:
>
>> Soll ich die erhaltenen strings in einer statemachine
>> abarbeiten?
>
> Ich habe Ulrich anders verstanden: Du hast ja offensichtlich
> ASCII-Zeichen o.ä., die einzeln einlaufen. Erste Aufgabe
> Deines Programmes ist, diese Einzelzeichen zu "Worten"
> (Token) zusammenzufassen.
...
>
> "awk" verwendet für alles ein "Pattern:Action"-Schema; das
> ist nicht so weit von Deiner switch-Anweisung entfernt - nur
> dass das Pattern ein regulärer Ausdruck sein kann (wenn mich
> meine Erinnerung nicht trügt.)
> Große Überschrift ist übrigens "Compilerbau"; vielleicht auch
> noch "Theorie formaler Sprachen".

Vielen Dank für deine ausführliche Erklärung.

Damit habe ich nun einen neuen Lösungsansatz :)

von Possetitjel (Gast)


Lesenswert?

Claudio Hediger schrieb:

> Früher habe ich immer Zeichen gesammelt, bis ein LineFeed
> kam und den enstandenen String mit einer Switch anweisung
> mehr oder weniger ausgewertet.
>
> Dies lief auch mehr schlecht als recht.

Nur interessehalber: Was war denn das "Schlechte" an dieser
Lösung?

von Jobst M. (jobstens-de)


Lesenswert?

Claudio Hediger schrieb:
> Dies lief auch mehr schlecht als recht.

Mich würde auch interessieren, was daran schlecht laufen soll.
Eine andere Art sehe ich nämlich gerade gar nicht, ohne dafür 
erheblichen Aufwand zu betreiben. Wenn im IRQ ausreichend Zeit ist, 
erledige ich die Abarbeitung des Strings komplett dort, sonst im 
Hauptprogramm. Zeichen von der Schnittstelle landen im Ringbuffer. Wenn 
CR/LF empfangen, wird der String entweder noch im Ringbuffer geparst 
oder die gesamte Zeile irgendwo anders hin kopiert.


Possetitjel schrieb:
> Das ist genauso, wie wenn Du im Deutschen vom "Strommotor" redest:

Da klappen sich mir jetzt aber nicht wegen des Strommotors die Fußnägel 
hoch :-)


Gruß

Jobst

von короткое троль (Gast)


Lesenswert?

Natuerlich gibt es Dinge, auch Maschinen mit null Zustaenden. Darunter 
versteht man gespeicherte Zustaende. Ein Lichtschalter, der hell macht 
solange man drueckt hat keinen Zustand, den man sich merken, oder 
detektieren muesste.

von Marek W. (ma_wa)


Lesenswert?

Mhm, ich denke mal du möchtest deinem GSM-Modem AT-Befehle senden und 
den Status auswerten.

Hier findest Du eine Diskussion zum Thema
http://stackoverflow.com/questions/3085070/finite-state-machine-parser

Ich finde es gar nicht so schlecht vom Gegenüber auf den Abschluss der 
Eingabe zu warten und diese komplett auszuwerten. Wenn dein GSM Modem 
die Zeilen mit CR/LF abschließt, würde das die Sache sehr vereinfachen. 
Eventuell solltest du dann aber auch einen Timeout einbauen um 
abgebrochene Teileingaben zu  verwerfen.

Ich habe öfters einfache Parser geschrieben um eine einfache Mensch 
Maschinen Kommunikation über ein Terminal zu ermöglichen. Die Aufgabe 
war hierbei, dass der Mensch die Maschine mit "logischen" Anweisungen 
parametrieren kann. Hierbei kam dann als erstes das Schlüsselwort, 
gefolgt von Optionen und Attributen und getrennt von einem Trennzeichen. 
Das Konzept kennt man ja zu genüge. Die Zeile wurde komplett eingelesen, 
anhand der Trennzeichen aufgetrennt und verarbeitet. Die Schlüsselworte 
und die Optionen wurden uppercase gewandelt und vor der Verarbeitung 
mittels CRC16 oder CRC32 in eine Prüfsumme umgewandelt. Diese Prüfsumme 
wurde dann als Token verwendet und in der Weiterverarbeitung 
ausgewertet. Ich hatte damals nicht viel Speicher und recht viele 
Funktionen. Da war halt kein Platz für die Verarbeitung und Speicherung 
langer Strings.

von Stefan W. (dl6dx)


Lesenswert?

Marek Walther schrieb:
> Die Schlüsselworte und die Optionen wurden uppercase gewandelt
> und vor der Verarbeitung mittels CRC16 oder CRC32 in eine Prüfsumme
> umgewandelt. Diese Prüfsumme wurde dann als Token verwendet und in
> der Weiterverarbeitung ausgewertet.

Das Verfahren nennt sich übrigens "Hashtabelle":
http://de.wikipedia.org/wiki/Hashtabelle

An den TO:

Bei den syntaktisch eher einfachen AT-Kommandos wäre für mich der erste 
Ansatz, erst einmal den String bis zum LF einzulesen (ggf. mit Timeout) 
und dann mit den Inhalten einer "Kommandotabelle" zu vergleichen.

Im einfachsten Ansatz über eine lineare Suche (Vergleich z.B. mit 
strncmp). Man könnte aber auch mehrstufig suchen, in dem man z.B. über 
die erste(n) Stelle des Kommandos in mehrere Tabellen verzweigt.

Ein Tabellenelement würde ich als struct aufbauen. Elemente:
- Der Teilstring des jeweiligen Kommandos
- ggf. ein int für den Vergleich mit strncmp
- ein Zeiger auf die "Verarbeitungsfunktion" für die Parameter des 
AT-Kommandos

Grüße

Stefan

von C. H. (hedie)


Lesenswert?

Stefan Wagner schrieb:
> Im einfachsten Ansatz über eine lineare Suche (Vergleich z.B. mit
> strncmp). Man könnte aber auch mehrstufig suchen, in dem man z.B. über
> die erste(n) Stelle des Kommandos in mehrere Tabellen verzweigt.
>
> Ein Tabellenelement würde ich als struct aufbauen. Elemente:
> - Der Teilstring des jeweiligen Kommandos
> - ggf. ein int für den Vergleich mit strncmp
> - ein Zeiger auf die "Verarbeitungsfunktion" für die Parameter des
> AT-Kommandos

Vielen Dank für all eure Posts.

Aktuell überlege ich mir gerade, wie ich das am elegantesten zu lösen 
bekomme.

Die idee mit der Hashtabelle gefällt mir auch sehr gut.
Wobei dieses verfahren, wie Stefan bereits erwähnte, eher weniger für 
meine Anwendung taugt. Aber sehr gut um es im Hinterkopf zu behalten!

Die Idee mit einer Komandotabelle wird es wohl werden :)

Dann kann ich ja den rest des Sonntages noch schön was Programmieren :)


Vielen Dank!

von Kein Name (Gast)


Lesenswert?

Wenn du den gcc benutzt - da ist ein flex dabei. Dein flex Quelltext 
besteht aus Mustern und Programmzeilen, die bei diesem Muster ausgeführt 
werden. Flex erstellt daraus einen C Quelltext, der zum größten Teil aus 
Tabellen besteht. Einfach zu ändern und sehr schnelles Programm.

P.S. wenn ihr bei Google nach "Statemachine" sucht - erster Treffer 
"Endlicher Automat – Wikipedia". Das ist gelaufen. Daran ändert ihr 
nichts mehr.

von ah8 (Gast)


Lesenswert?

> Wie geht man normalerweise an sowas ran?
> Gibt es interpreter konzepte?

Es gibt ein kleines Büchlein von Niklaus Wirth, ISBN 978-3519323389, 
welches die Grundzüge des Compilerbaus auf ca. 50 Seiten auch für den 
Einsteiger sehr gut verständlich erklärt. Das Ergebnis genügt, um einen 
Pascal-Compiler zu schreiben. Wer's etwas akademischer will ist mit ISBN 
978-0321486813 gut beraten. Hier werden alle bisher gefallenen Begriff, 
beginnend bei der Chomsky-Hierarchie verschiedener Klassen von Sprachen 
einschließlich der entsprechenden Maschinenmodelle (endliche und 
unendliche, deterministische und nicht-deterministische Automaten), die 
nötig sind, um sie zu erkennen, bis hin zu Compilerbauwerkzeugen wie lex 
und yacc und die auf reguläre Ausdrücke aufbauenden Systemwerkzeuge wie 
grep, sed oder awk erklärt. Beide Bücher sollten in jeder gut sortierten 
Universitätsbibliothek vorhanden sein, letzteres auch in deutscher 
Übersetzung. Alle Grundlagen gelten für Compiler und Interpreter 
gleichermaßen.

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.