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!
>Gibt es interpreter konzepte?
Ich glaube du suchst das Zauberwort "Endlicher Automat"!
Ulrich F. schrieb: >>Gibt es interpreter konzepte? > Ich glaube du suchst das Zauberwort "Endlicher Automat"! Du meinst aber nicht ne Statemachine?
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?
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.
>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.
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!
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 ;)
Dies kommt sehr darauf an, wie du die Befehle structurierst. Ansonsten, prinzipiell sind die Befehle Strings, welche du einen nach dem anderen durcharbeitest.
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.
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...
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
Claudio schrieb: > Hoffe jemand kann das lesen Hä jo klar, dänk! Wobei bem ene Wallischer hetti ou Müeh...
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 :-(
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.
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.
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
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
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.
Ich wiederum kann mich nicht an den unendlichen Automaten erinnern, sehr wohl aber an die Turingmaschine.
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".
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.
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 :)
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?
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
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.
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.
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
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!
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.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.