Was ist der beste Weg, um die Daten an die serielle Schnittstelle zu senden?

7

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:)

  
  1. Im Mikrocontroller gibt es einen Analog-Digital-Wandler mit 10   Bit-Auflösung. (Es wird ein ausgeben   Wert zwischen 0 und 1023)

  2.   
  3. Ich muss diesen Wert über den seriellen Port an den PC senden.

  4.   
  5. Aber Sie können nur 8 Bits gleichzeitig schreiben. (Sie müssen Bytes schreiben). Es ist   eine Begrenzung im Mikrocontroller.

  6.   
  7. Also im obigen Fall muss ich mindestens 2 Bytes senden.

  8.   
  9. 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.

  10.   

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. :)

    
Chathuranga Chandrasekara 19.10.2010, 07:57
quelle

4 Antworten

15

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.

Regelmäßiges Sampling, unbekannter Join-Punkt

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 . Auf diese Weise:

  • es wird kein Trennzeichen benötigt (Sie können feststellen, welches Byte Sie durch die 0 oder 1 lesen)
  • Sie können definitiv jeden 1-Bit-Fehler erkennen, so dass Sie über schlechte Daten Bescheid wissen

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.

  1. Angenommen, ich möchte 714 = 1011001010 senden.
  2. Split in 2 10110, 01010
  3. Bits hinzufügen, um das erste und das zweite Byte 010110, 101010
  4. anzuzeigen
  5. Berechne die Parität für jede Hälfte: p0 = par (010) = 1, q0 = par (110) = 0, p1 = par (101) = 0, q1 = par (010) = 1
  6. Bytes sind dann 10010110, 01101010

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).

Dichte Daten, bekannter Verknüpfungspunkt

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>

Dichte Daten, unbekannter Join-Punkt

In 7 Bytes können Sie 5 10-Bit-Werte mit 6 Ersatzbits senden. Sende 5 Werte wie folgt:

  • Byte 0: 0 (7 Bits)
  • Byte 1: 1 (7 Bits)
  • Byte 2: 1 (7 Bits)
  • Byte 3: 1 (7 Bits)
  • Byte 4: 0 (7 Bits)
  • Byte 5: 0 (7 Bits)
  • Byte 6: (8 Bits)

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):

  • Byte 0: 0 (7 Bits) 7
  • Byte 1: 1 (7 Bits) 14
  • Byte 2: 1 (7 Bits) 21
  • Byte 3: 1 (7 Bits) 28
  • Byte 4: 1 (7 Bits) 35
  • Byte 5: 1 (7 Bits) 42
  • Byte 6: 0 (7 Bits) 49
  • Byte 7: (8 Bits) 57
  • Byte 8: (8 Bits) 65
  • Byte 9: (8 Bits) 73
  • Byte 10: (8 Bits) 81
  • Byte 11: 0 (7 Bits) 88
  • Byte 12: (8 Bits) 96
  • Byte 13: (8 Bits) 104
  • Byte 14: (8 Bits) 112
  • Byte 15: (8 Bits) 120

Das ist ein ziemlich lustiges Problem!

    
Nick Fortescue 19.10.2010, 08:10
quelle
7

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.

    
Paul R 19.10.2010 08:01
quelle
4

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%     
Peer Stritzinger 19.10.2010 08:45
quelle
0

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.

    
old_timer 19.10.2010 12:08
quelle