Die übertragung einer int zwei bytes an den Arduino
Ich bin der Probenahme bei hohen Frequenzen und übertragen müssen die 10-bit-ADC-Wert über die UART aus meinem Arduino.
Standardmäßig verwendet ein byte pro Zeichen. Also, wenn dies ein analogRead ergäbe den Wert von "612", es würde senden über UART "6" als ein byte, "1" als ein byte, "2" als ein byte, und das Zeilenabschlusszeichen als das Letzte byte.
Da meine Abtastrate ist abgeschnitten von dieser Mitteilung, ist es wichtig, dass es so effizient und einheitliche wie möglich, so bin ich versucht zu zwingen, es zu verwenden zwei bytes zu übertragen, die Daten, egal, was die tatsächlichen Daten (standardmäßig würde es werden drei bytes übertragen, "23", vier bytes für die übertragung "883" und fünf bytes für die übertragung "1001").
Derzeit bin ich etwas wie das zu tun, was ist der beste Weg den ich gefunden habe:
int a = 600; //Just an example
char high = (char)highByte(a);
char low = (char)lowByte(a);
Serial.print(high);
Serial.println(low);
Derzeit werden drei bytes (einschließlich \n) unabhängig vom Wert. Gibt es eine noch effizientere Methode?
Nur drucken Sie es mit etwas, wie
Serial.print(foo, BIN);
Funktioniert überhaupt nicht. Es verwendet ein byte pro jedes einzelne bit der binären Darstellung von foo, das ist ziemlich albern.
- Nicht versenden newline überhaupt? Wenn Sie wissen, dass die Daten immer ein paar bytes, und keine Gedanken über ablegen eines byte (Sie können Synchronisations-bytes verteilt in den stream eher selten), dann gibt es keinen Grund, ein Zeilenumbruch. Außerdem, wenn Sie senden Sie die Daten als Binär -, was wird geschehen, wenn eines dieser bytes zufällig
10
(das gleiche wie ASCII-Zeilenvorschub)? - Serial.write() ist die Methode zum behandeln binärer Daten. Die Serielle.die print () - Funktionen sind so konzipiert, konvertieren Sie den Wert in einen lesbaren text.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich könnte etwas fehlt, aber warum nutzen Sie nicht
Serial.write(byte)
?Können Sie eine methode wie diese:
was planen Sie zu tun mit den Daten auf Ihrem computer?
Wenn Sie binäre Daten über eine serielle Leitung, sollten Sie wirklich nicht verwirren, alles, was mit einem text-Stil Zeilenvorschub Trennzeichen.
Auf der anderen Seite, es ' s ziemlich schwer (für das andere Ende), um zu wissen, welches byte welche, ohne irgendeine Art von Synchronisation helfen.
Aber, da Sie nur 10-bit-payload, aber senden 16-bit-Daten, können Sie "tun" UTF-8" verwenden und eine gratis-bit-signal "start-Wert". Dies erfordert die Verwendung von nur 7 bits jedes 8-bit-byte der Nutzlast, aber das ist in Ordnung, da 7 + 7 = 14, das ist mehr als 10. Wir können dem 8-bit bedeuten: "dies ist das high-byte von a neues paar von bytes":
In der oben genannten, die in zwei bytes übertragen werden:
Den Empfänger nicht über in umgekehrter Richtung:
Sollte diese Arbeit, und setzt das most significant bit des high-byte, die zuerst gesendet, um zu bestätigen, dass diese in der Tat das high-byte. Das niedrige byte wird nie das MSB gesetzt.
high = ((a >> 7) & 0xff) | 0x80; low = (a & 0x7f);