So senden Sie ein Schwimmer Sie über serielle
Was ist der beste Weg zu schicken float
, double
, und int16
über Seriell an den Arduino?
Den Serial.print()
sendet nur Werte wie ASCII codiert. Aber ich will senden die Werte als bytes. Serial.write()
akzeptiert byte und bytearrays, aber was ist der beste Weg, um konvertieren Sie die Werte in bytes?
Versuchte ich warf einen int16
zu einem byte*
ohne Glück. Ich habe auch memcpy, aber verwendet, um viele CPU-Zyklen. Arduino verwendet einfache C/C++. Es ist ein ATmega328 mikrocontroller.
- mögliche Duplikate von wie die Ausgabe eines int in Binär?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, diese zahlen müssen Sie zuerst konvertieren Sie Sie in ASCII strings. Wenn Sie arbeiten mit C,
sprintf()
ist, IMO, die praktischste Weg, dies zu tun-Konvertierung:[Später Hinzugefügt: AAAGHH! ich vergaß, dass für
ints
/longs
die Funktion input-argument will nicht signiert. Ebenfalls für den format-string übergebensprintf()
. Also änderte ich es unten. Tut mir Leid, mein schreckliches Aufsicht, die hätte ein schwer zu findender Fehler. Auchulong
macht es ein wenig mehr allgemein.]Und ähnliche für floats und doubles. Der code macht die Konvertierung muss im Voraus bekannt sein. Es muß gesagt werden - was für eine Art von Entität es konvertieren, so dass Sie könnte am Ende mit Funktionen
char *float2str( float float_num)
undchar *dbl2str( double dblnum)
.Erhalten Sie einen NUL-terminierten Links eingestellt (ohne führende Leerzeichen oder Nullen) Zeichen-string aus der Umwandlung.
Können Sie die Konvertierung anywhere/anyhow, wie Sie wollen; diese Funktionen sind nur Abbildungen.
hm. Wie wäre es damit:
Verwenden Sie die Firmata Protokoll. Zitat:
Jargon Wort, das Sie nachschlagen möchten, ist "Serialisierung".
Es ist ein Interessantes problem, über eine serielle Verbindung, die könnten, haben Beschränkungen auf, was die Charaktere gehen können, Ende zu Ende, und möglicherweise nicht in der Lage, pass acht bits pro Zeichen entweder.
Einschränkungen auf bestimmte Zeichen-codes sind relativ Häufig. Hier ein paar aus dem stehgreif:
Wenn software flow control verwendet wird, dann konventionell werden die steuerzeichen DC1 und DC3 (Ctrl-Q und Ctrl-S, manchmal auch als XON und XOFF) nicht übertragen werden, da Daten, weil Sie geschickt werden, starten und stoppen Sie den sender am anderen Ende des Kabels.
Auf einigen Geräten, NUL und/oder DEL-Zeichen (0x00 bis 0x7F), kann einfach verschwinden aus der Empfänger-FIFO.
Wenn der Empfänger eine Unix-tty, und die termio-Modi sind nicht richtig eingestellt ist, dann wird das Zeichen Ctrl-D (EOT oder 0x04) kann der tty-Treiber für signal-ein-Ende-der-Datei, um den Prozess, der den tty öffnen.
Eine serielle Verbindung ist in der Regel konfigurierbar für-byte-Breite und der möglichen Aufnahme von einem parity-bit. Einige verbindungen erfordern, dass ein 7-bit-byte mit parity verwendet werden, eher als eine 8-bit-byte. Es ist sogar möglich, für eine Verbindung zum (wirklich alten) legacy-hardware zu konfigurieren, viele serielle ports für 5-bit 6-bit-bytes. Wenn weniger als 8-bit pro byte, dann ein komplizierteres Protokoll erforderlich sind, um binäre Daten.
ASCII85 ist eine beliebte Technik für das arbeiten rund um die beiden 7-bit-Daten und-Beschränkungen steuerzeichen. Es ist eine Konvention für das neu-schreiben von binären Daten mit nur 85 sorgfältig ausgewählte ASCII-Zeichen-codes.
Darüber hinaus werden Sie sicherlich haben, um sorgen über die Bytereihenfolge zwischen sender und Empfänger. Sie könnten auch sorgen über die floating-point-format, da nicht jedes system verwendet IEEE-754-floating-point.
Die Quintessenz ist, dass oft genug die Wahl eines reinen ASCII-Protokoll ist die bessere Antwort. Es hat den Vorteil, dass es verstanden werden kann von einem Menschen, und ist viel widerstandsfähiger, um Probleme mit der seriellen Verbindung. Es sei denn, Sie senden gobs von floating-point-Daten, dann Ineffizienz der Darstellung kann aufgewogen werden durch die einfache Umsetzung.
Nur liberal, was Sie akzeptieren, und konservative über das, was Sie aussenden.
Zählt die Größe? Wenn Sie es tut, Sie codieren kann jede 32-bit-Gruppe in 5 ASCII-Zeichen mit ASCII85, siehe http://en.wikipedia.org/wiki/Ascii85.
Vielleicht ist das der beste Weg, um konvertieren von Float nach Byte und Byte-Float-Hamid Reza.
betrifft.
`
Strukturen und Gewerkschaften lösen das Problem. Verwenden Sie eine gepackte Struktur mit einem byte großen union-matching der Struktur. Überlappen sich die Zeiger auf die Struktur und die union (oder fügen Sie die union in der Struktur). Verwenden Sie Serial.schreiben Sie an den stream senden. Haben eine übereinstimmende Struktur/union am empfangenden Ende. Solange die byte-Reihenfolge entspricht, kein Problem, ansonsten kann man entpacken mit dem "C" hto(s..l) Funktionen. Fügen Sie die "header" - info zu Dekodieren, die verschiedenen Strukturen/unions.