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
Antwort
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.
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?
- 1. So implementieren Sie eine Warteschlange als Priorität Warteschlange in Omnet ++?
- 2. Implementieren von ls-Befehlen in c
- 3. So implementieren Sie eine persistente Warteschlange in Android
- 4. PostgreSQL - Implementieren einer zuverlässigen Warteschlange
- 5. Implementieren Warteschlange mit 2 Stapeln
- 6. Implementieren der Warteschlange mit Arrays
- 7. Realm - Implementieren der asynchronen Warteschlange
- 8. Der effizienteste Weg, eine vorbeugende Warteschlange zu implementieren?
- 9. Initialisieren Sie eine Warteschlange von Adressen
- 10. Implementieren verzögerte Warteschlange mit RxJs Observable
- 11. Implementieren eines Semaphors mit einer Warteschlange
- 12. Benötigen Sie eine Listbox mit Dropdown-Befehlen
- 13. Eine zirkuläre Warteschlange durchlaufen, ohne eine temporäre Warteschlange zu verwenden
- 14. Implementieren Sie eine Warteschlange mit 2 Stacks Python und analysieren Sie die Laufzeit
- 15. Eine Warteschlange von Hintergrundaufgaben in rxjava
- 16. So implementieren Sie eine Bearbeitungsgenehmigungswarteschlange in Django
- 17. implementieren-your-own blockierende Warteschlange in Java
- 18. Implementieren einer Warteschlange durch Turing-Maschine
- 19. Gibt es eine bessere Möglichkeit, eine Remove-Methode für eine Warteschlange zu implementieren?
- 20. Übergeben von Befehlen an eine Funktion
- 21. Rückgabewerte von Ansible-Befehlen
- 22. Können Sie gleichzeitig in eine Warteschlange gelangen?
- 23. Java-Klasse implementieren First-in-first-out-Warteschlange
- 24. Implementieren einer einfachen Warteschlange mit PHP und MySQL?
- 25. Füllen Sie eine Warteschlange mit Adresse anstelle von Zahlen
- 26. Wie erstellen Sie eine Warteschlange von Threads in Delphi Xe2?
- 27. Wie - spülen Sie eine Rabbitmq-Warteschlange mit Hilfe von curl
- 28. Implementieren Sie eine Funktion als []
- 29. So implementieren Sie eine Stopptaste
- 30. Implementieren einer Warteschlange parallel Stapelverarbeitung in Neo4j Cypher
Was ist dein Problem, du musst zeigen, was du getan hast. –
* Was wäre die beste (und einfachste) Art, es zu tun? * - "Beste" und "einfachste" sind alle subjektiv. – PaulMcKenzie
Verkapseln Sie Ihren Befehl mithilfe einer TLV-Struktur. https://stackoverflow.com/questions/tagged/tlv – Amadeus