2017-06-22 3 views
1

Ich habe einen Ringpuffer, in dem ich einige Bytes über serielle Schnittstelle empfangen möchte. Diese empfangenen Bytes bestehen nun aus einem Befehl gefolgt von Datenbytes. Und jede dieser Befehls- und Datenkombinationen könnte unterschiedlich lang sein. Ich möchte eine Methode implementieren, in der ich einen Befehl aus diesem Puffer kopieren und ausführen kann. Dann der nächste Befehl und so weiter. Was wäre der beste (und einfachste) Weg, dies zu tun?Implementieren Sie eine Warteschlange von Befehlen

+1

Was ist dein Problem, du musst zeigen, was du getan hast. –

+0

* Was wäre die beste (und einfachste) Art, es zu tun? * - "Beste" und "einfachste" sind alle subjektiv. – PaulMcKenzie

+0

Verkapseln Sie Ihren Befehl mithilfe einer TLV-Struktur. https://stackoverflow.com/questions/tagged/tlv – Amadeus

Antwort

0

Einfache Byte-Stream wird ausreichen. Eigentlich kann man sogar einen Wrapper über std::stringstream für Ihre Bytedatenstream als Speicher als erster Schritt verwenden: füllen Sie es mit der Routine, die mit der seriellen Schnittstelle kommuniziert und las von ihm mit dem Befehlsdecoder.

0

Wenn Sie über Ringpuffer sprechen, kann es etwas so einfach sein wie char [ring_size_in_bytes] und den aktuellen Standortindikator int. Das Lesen vom Port sollte Byte für Byte erfolgen, und wenn Sie das Ende des Puffers erreichen, beginnen Sie bei Null.

Ich verwende normalerweise einfachen Puffer für Befehl und für Daten vom Port gelesen. Nach dem Kopieren von Daten vom Port in einen kleinen Puffer interpretiere ich Daten im Fluge, wobei ich versuche, den Anfang des Befehls zu finden, und beginne dann mit dem Puffer, bis ich einen neuen Anfang erkenne. Dann reihe ich den Befehl in die Warteschlange und beginne von vorne. Dies bildet die obere Hälfte (schnelle) der Routine-Routine.

Der serielle Port ist sehr langsam, daher besteht kein Risiko, dass Sie die Daten nicht schnell genug lesen. Jede Iteration (Interrupt) werden Sie einige Bytes geben ...

I Warteschlange vom Typ verwenden würde, die Ihre Befehle kapselt empfangenen Befehle Liste zu speichern.

Wie kompliziert ist Ihr serielles Protokoll?

Verwandte Themen