Dies ist mit Mikrocontrollern verwandt, aber ich denke, es hier zu posten, weil es ein Problem mit Algorithmen und Datentypen ist und nicht mit irgendeiner Hardware. Ich werde das Problem erklären, damit jemand, der keine Hardwarekenntnisse hat, noch teilnehmen kann:)
Im Mikrocontroller gibt es einen Analog-Digital-Wandler mit 10 Bit-Auflösung. (Es wird ein ausgeben Wert zwischen 0 und 1023)
Ich muss diesen Wert über den seriellen Port an den PC senden.
Aber Sie können nur 8 Bits gleichzeitig schreiben. (Sie müssen Bytes schreiben). Es ist eine Begrenzung im Mikrocontroller.
Also im obigen Fall muss ich mindestens 2 Bytes senden.
Meine PC-Anwendung liest nur eine Zahlenfolge zum Zeichnen. Damit es sollte zwei aufeinanderfolgende erfassen Bytes und bauen Sie die Nummer zurück. Aber hier brauchen wir ein Trennzeichen Charakter auch. aber das Trennzeichen hat immer noch einen ASCII-Wert zwischen 0 und 255, dann verwechselt es den Prozess.
Was ist der einfachste Weg, dies zu tun? Soll ich die Werte als Folge von Zeichen senden?
%Vor%Zusammenfassend muss ich eine Sequenz von 10-Bit-Nummern auf dem schnellsten Weg über Serial schicken. :)
Sie müssen 10 Bits senden, und weil Sie jeweils ein Byte senden, müssen Sie 16 Bits senden. Die große Frage ist, wie viel Geschwindigkeit eine Priorität hat, und wie synchronisiert sind Sender und Empfänger? Ich kann an 3 Antworten denken, abhängig von diesen Bedingungen.
Wenn das Gerät die ganze Zeit läuft, sind Sie nicht sicher, wann Sie eine Verbindung herstellen (Sie könnten jederzeit in der Sequenz teilnehmen), aber die Abtastrate ist langsamer als die Kommunikationsgeschwindigkeit, so dass Sie sich nicht um die Größe kümmern Ich denke, ich würde es wahrscheinlich wie folgt tun. Angenommen, Sie versuchen, die zehn Bits abcdefghij
zu senden (jeder Buchstabe ein Bit).
Ich würde pq0abcde
dann pq1fghij
senden, wobei p
und q
Fehlerprüfbits
Ich habe Mühe, einen guten 2-Bit-Fehlerkorrekturcode zu finden, also würde ich einfach pa-Paritätsbit für die Bits 2,3 und 4 (0, ab oben) und qa-Paritätsbit für 5 6 und 7 machen (c, d, e oben). Dies könnte an einem Beispiel klarer sein.
Sie können dann viele verschiedene Fehlerzustände erkennen, schnell überprüfen, welches Byte Sie gesendet werden, wenn Sie die Synchronisation verlieren, und keiner der Vorgänge dauert sehr lange in einem Mikrocontroller (ich würde die Parität mit einem 8-Eintrag-Lookup machen Tabelle).
Wenn Sie wissen, dass der Reader zur gleichen Zeit wie der Writer startet, senden Sie einfach die 4 Zehn-Bit-Werte als 5 Bytes. Wenn Sie immer 5 Bytes gleichzeitig lesen, dann keine Probleme. Wenn Sie noch mehr Platz sparen möchten und bereits gute Beispieldaten haben, würde ich mit Huffman-Kodierung komprimieren. p>
In 7 Bytes können Sie 5 10-Bit-Werte mit 6 Ersatzbits senden. Sende 5 Werte wie folgt:
Dann, wann immer Sie 3 1 in Folge für das höchstwertige Bit sehen, wissen Sie, dass Sie die Bytes 1, 2 und 3 haben. Diese Idee verschwendet 1 Bit in 56, könnte also noch effizienter gemacht werden, aber Sie hätten um mehr Daten gleichzeitig zu senden. ZB (5 aufeinanderfolgende, 120 Bits in 16 Bytes):
Das ist ein ziemlich lustiges Problem!
Die beste Methode besteht darin, die Daten in eine ASCII-Zeichenkette umzuwandeln und sie so zu senden, dass das Debugging viel einfacher wird und verschiedene Kommunikationsprobleme vermieden werden (besondere Bedeutung bestimmter Steuerzeichen usw.).
Wenn Sie wirklich die gesamte verfügbare Bandbreite verwenden müssen, können Sie 4 10-Bit-Werte in 5 aufeinanderfolgende 8-Bit-Bytes packen. Sie müssen auf die Synchronisierung achten.
Da Sie "den schnellsten Weg" angegeben haben, ist eine Erweiterung der Zahlen auf ASCII ausgeschlossen.
Meiner Meinung nach kann durch die folgende Codierung ein guter Kompromiss zwischen Einfachheit und Leistung des Codes erzielt werden:
Zwei 10bit-Werte werden in 3 Bytes wie folgt codiert.
erste 10-Bit-Wert-Bits: = abcdefghij
zweite 10-Bit-Wert-Bits: = klmnopqrst
Bytes zum Verschlüsseln:
%Vor%Es gibt ein Bit mehr (_) verfügbar, das für eine Parität über alle 20 Bits für die Fehlerprüfung verwendet werden könnte oder einfach auf einen festen Wert gesetzt wird.
Ein Beispielcode (setzt 0 an der Position _):
%Vor%Normalerweise verwende ich ein Startbyte und eine Prüfsumme und in diesem Fall eine feste Länge, also sende 4 Bytes, der Empfänger kann nach dem Startbyte suchen und wenn die nächsten drei zu einer bekannten Menge summieren, dann ist es ein gutes Paket herauszunehmen die mittleren zwei Bytes, wenn nicht weiter suchen. Der Empfänger kann immer neu synchronisieren und es wird nicht die Bandbreite von Ascii verschwenden. Ascii ist Ihre andere Option, ein Startbyte, das keine Zahl und vielleicht vier Dezimalzahlen ist. Dezimal ist definitiv kein Spaß in einem Mikrocontroller, also beginnen Sie mit etwas nicht Hexen wie X zum Beispiel und dann drei Bytes mit den Hex Ascii Werten für Ihre Nummer. Suche nach dem x die nächsten drei Bytes untersuchen, hoffe auf das Beste.
Tags und Links algorithm embedded microcontroller pic