Implementieren von Steuerbefehlen für eine MCU über Seriell


8

Ich suche nach einer Befehlsschnittstelle in ein Projekt, das ich mache und das Befehle über seriell von einem PC akzeptiert.

Die Idee ist, dass das Gerät seine Sache macht, aber es erhält einen Befehl, es wird es ausführen. Dies unterscheidet sich von den meisten Beispielen, die ich gefunden habe und bei denen es sich nur um ein Leerlaufgerät handelt, das auf serielle Daten wartet.

So zum Beispiel ein Gerät, das LEDs steuert und eine Animation abspielt. Nehmen wir an, es gibt 3 voreingestellte Animationen, und wenn es eingeschaltet wird, wird immer die Nummer 1 abgespielt. Auf der PC-Seite würde ich den Befehl 'Preset 2 abspielen' oder 'Farbe in Grün ändern' oder eine Live-Echtzeitanimation an das Gerät senden auf den LEDs zu spielen.

Meine Frage ist also, dass ich nicht viele Informationen zu diesem "Entwurfsmuster" finden kann? Ich weiß nicht, wo ich anfangen soll zu suchen. Das nächste, was ich gekommen bin, sind vorgefertigte serielle Arduino-Parsing-Bibliotheken. Ich bin jedoch auf der Suche nach mehr C / Nicht-Arduino / theoretischem Ansatz.

Ich habe mich mit seriellen Protokollen befasst, aber das sind nur Dinge wie SPI und I2C usw., nicht wirklich, wie man eine Steuerungs- / Befehlsschnittstelle in Software implementiert.

Ich habe auch etwas über HDLC herausgefunden, obwohl es eher ein Standard / ein Protokoll zu sein scheint. Ein ähnlicher Thread ist /programming/1445387/how-do-you-design-a-serial-command-protocol-for-an-embedded-system, der einige sehr nette Informationen enthält, aber wieder zu tun ist mit dem Protokoll / der Kommunikation selbst.

Ich versuche herauszufinden, wie man dies codiert / implementiert, um einen Befehl oder eine Steuerungsfähigkeit zu erstellen.

Verwende ich eine Endlosschleife, um die Seriennummer für einen eingehenden Befehl zu überwachen und abzufangen, und verwende eine Liste von IF-Anweisungen, um auszuwählen, welcher Befehl ausgeführt werden soll, aber was passiert dann, wenn keine Befehle vorhanden sind und das System normal sein sollte oder wenn dies der Fall ist einen Befehl verpasst?

Interrupt angetriebene Zustandsmaschine?

Gibt es dafür einen offiziellen Namen, mit dem man recherchieren und Beispiele finden kann?

BEARBEITEN:

Für alle, die die gleiche Frage haben, fand ich dieses wirklich schöne Beispiel während der Recherche, http://www.adnbr.co.uk/articles/parsing-simple-usart-commands


Warum nicht ein Framework wie FreeMODBUS oder Firmata verwenden?
Ignacio Vazquez-Abrams

Antworten:


5

Es gibt viele Möglichkeiten, ein Kommunikationsprotokoll zu implementieren. Zum Beispiel können Sie wählen, um zu verwenden:

  • menschlich lesbares Format oder binär
  • Fehlerprüfung wie eine Prüfsumme oder CRC
  • Nachrichtenzeichen starten und / oder beenden
  • Nachrichtenlänge, Anzahl usw. Nutzdateninformationen
  • Bestätigungs- / Negativbestätigungs- / Wiederholungsmechanismen

Ihr Beispielbefehl ist für Menschen lesbar und sollte '\ n' (Eingabe) als Zeichen für das Ende der Nachricht verwenden. Anfang / Ende von Nachrichtenzeichen erleichtern das Parsen des Eingabestreams.

Ein typischer Programmablauf besteht darin, auf den Empfang des Startzeichens zu warten und anschließend nachfolgende Bytes in einem Nachrichtenpuffer zu speichern, bis das Endzeichen empfangen wird. Sobald dies passiert ist, übergeben Sie den Puffer an eine andere Funktion, um die Nachricht zu analysieren. Wenn kein Startzeichen vorhanden ist, speichern Sie die Bytes sofort, bis das Endzeichen empfangen wird.

Die meisten * eingebetteten Systeme laufen in einer Endlosschleife. Die Behandlung des seriellen Sendens und Empfangens erfolgt über Interrupts auf dem Arduino (siehe HardwareSerial.cpp). Empfangene Zeichen werden in einen Puffer gestellt. Bei jeder Iteration der Schleife prüfen Sie, ob sich Zeichen im Puffer befinden (Serial.available ()), und verarbeiten sie. Durch das Empfangen von Zeichen mithilfe von Interrupts sollten keine Zeichen übersehen werden. Sie führen jedoch nicht die gesamte Verarbeitung in diesen Interrupt-Routinen durch, da sie sonst zu lang werden und daher nachfolgende Interrupts verpassen.

Wenn Sie nicht möchten, dass sich Ihr Gerät im Leerlauf befindet, versetzen Sie es in den Ruhezustand, um die Schleife bis zu einem Interrupt oder einem anderen Ereignis anzuhalten.

Ich mag diese Bibliothek für lesbare Nachrichten sehr: http://playground.arduino.cc/Code/Messenger

* Ich kann mir kein System vorstellen, das es nicht tut, aber vielleicht gibt es da draußen eines.


3

Alles, was Ihr Programm tun muss, ist:
1. Überprüfen Sie häufig die serielle Schnittstelle auf ein neues Zeichen.
2. Wechseln Sie je nach Zeichen zur entsprechenden Routine / setzen Sie den Status / was auch immer.
3. Gehen Sie zu 1

Das Programm kann auf einzelne Zeichen reagieren, oder Sie können Ihr eigenes Nachrichtenformat erstellen. Ich habe häufig einen Cammand mit "$" gestartet und mit Zeilenumbruch beendet und lesbare ASCII-Zeichen für den Befehl verwendet (erleichtert das Debuggen!).

Stellen Sie sicher, dass das Programm nicht hängen bleibt, wenn es einen ungültigen Befehl erhält!


Einige automatisierte Testgeräte (ATE) verwenden dazu sehr ähnliche serielle Verbindungen.
Löffel
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.