Vielleicht ist das der beste Weg, Float in Byte und Byte in Float, Hamid Reza, zu konvertieren.
%Vor%Grüße. "
Was ist der beste Weg, um float
, double
und int16
über die serielle Schnittstelle von Arduino zu senden?
Das Serial.print()
sendet nur Werte als ASCII . Aber ich möchte die Werte als Bytes senden. Serial.write()
akzeptiert Byte- und Bytearrays, aber was ist der beste Weg, die Werte in Bytes zu konvertieren?
Ich habe versucht, ein int16
auf ein byte*
zu setzen, ohne Glück. Ich habe auch memcpy benutzt, aber das benutzt viele CPU-Zyklen. Arduino verwendet einfaches C / C ++. Es ist ein ATmega328 Mikrocontroller.
Ja, um diese Zahlen zu senden, müssen Sie sie zuerst in ASCII Zeichenfolgen konvertieren. Wenn Sie mit C arbeiten, ist sprintf()
, IMO, der einfachste Weg, diese Konvertierung durchzuführen:
[Später hinzugefügt: AAAGHH! Ich habe vergessen, dass für ints
/ longs
das Input-Argument der Funktion unsigniert werden soll. Dies gilt auch für die Formatzeichenfolge, die an sprintf()
übergeben wurde. Also habe ich es unten geändert. Tut mir leid wegen meiner schrecklichen Aufsicht, die ein schwer zu findender Fehler gewesen wäre. Außerdem macht ulong
es etwas allgemeiner.]
Und ähnlich für Floats und Doubles. Der Code, der die Umwandlung durchführt, ist im Voraus bekannt. Es muss gesagt werden - welche Art von Entity es konvertiert, also könnten Sie mit den Funktionen char *float2str( float float_num)
und char *dbl2str( double dblnum)
enden.
Sie erhalten eine NUL-terminierte Zeichenkette ohne Links (keine führenden Leerzeichen oder Nullen) aus der Konvertierung.
Sie können die Konvertierung überall / beliebig durchführen. Diese Funktionen sind nur Illustrationen.
Verwenden Sie das Protokoll Firmata . Quote:
Firmata ist ein generisches Protokoll für die Kommunikation mit Mikrocontrollern von Software auf einem Host-Computer. Es ist beabsichtigt, mit jedem Host zu arbeiten Computersoftwarepaket. Im Moment gibt es ein passendes Objekt in einem Anzahl der Sprachen. Es ist einfach, Objekte für andere Software hinzuzufügen Verwenden Sie dieses Protokoll. Im Grunde erstellt diese Firmware ein Protokoll für Sprechen Sie mit dem Arduino von der Host-Software. Das Ziel ist es zu ermöglichen Leute, um den Arduino vollständig von Software auf dem Host zu steuern Computer.
Das Jargon-Wort, das Sie suchen müssen, ist "Serialisierung".
Es handelt sich um ein interessantes Problem bei einer seriellen Verbindung, bei der die Zeichen, die endweise stehen können, eingeschränkt sind und möglicherweise auch acht Bits pro Zeichen nicht übergeben werden können.
Einschränkungen für bestimmte Zeichencodes sind ziemlich üblich. Hier ein paar aus dem Stegreif:
Wenn die Software-Flusssteuerung verwendet wird, können die Steuerzeichen DC1 und DC3 (Strg-Q und Strg-S, manchmal auch XON und XOFF genannt) konventionell nicht als Daten übertragen werden, da sie an Start und gesendet werden Stoppen Sie den Sender am anderen Ende des Kabels.
Auf einigen Geräten können NUL- und / oder DEL-Zeichen (0x00 und 0x7F) einfach aus dem FIFO des Empfängers verschwinden.
Wenn der Empfänger ein Unix-tty ist und die termio-Modi nicht korrekt eingestellt sind, kann das Zeichen Strg-D (EOT oder 0x04) dazu führen, dass der tty-Treiber ein Dateiende an den Prozess signalisiert das hat die tty geöffnet.
Eine serielle Verbindung ist normalerweise für die Bytebreite und die mögliche Einbindung eines Paritätsbits konfigurierbar. Einige Verbindungen erfordern, dass ein 7-Bit-Byte mit einer Parität anstelle eines 8-Bit-Byte verwandt wird. Es ist sogar möglich, für die Verbindung mit (ernsthaft alter) Legacy-Hardware viele serielle Ports für 5-Bit- und 6-Bit-Bytes zu konfigurieren. Wenn weniger als 8 Bits pro Byte verfügbar sind, ist ein komplizierteres Protokoll erforderlich, um binäre Daten zu verarbeiten.
ASCII85 ist eine beliebte Technik, um sowohl 7-Bit-Daten als auch Einschränkungen bei Steuerzeichen zu umgehen. Es ist eine Konvention zum Umschreiben von Binärdaten mit nur 85 sorgfältig ausgewählten ASCII-Zeichencodes.
Außerdem müssen Sie sich um die Byte-Reihenfolge zwischen Sender und Empfänger kümmern. Sie müssen sich möglicherweise auch um das Fließkommaformat kümmern, da nicht jedes System IEEE-754 Fließkomma verwendet.
Die Quintessenz ist, dass oft die Auswahl eines reinen ASCII-Protokolls die bessere Antwort ist. Es hat den Vorteil, dass es von einem Menschen verstanden werden kann, und ist viel resistenter gegenüber Problemen mit der seriellen Verbindung. Sofern Sie keine Floating-Point-Daten senden, kann die Ineffizienz der Repräsentation durch die Einfachheit der Implementierung aufgewogen werden.
Sei einfach liberal in dem, was du akzeptierst, und konservativ darüber, was du aussendest.
Ist die Größe wichtig? Wenn dies der Fall ist, können Sie jede 32-Bit-Gruppe mit ASCII85 in 5 ASCII-Zeichen codieren, siehe Ссылка .
Verwenden Sie das Protokoll Firmata . Quote:
Firmata ist ein generisches Protokoll für die Kommunikation mit Mikrocontrollern von Software auf einem Host-Computer. Es ist beabsichtigt, mit jedem Host zu arbeiten Computersoftwarepaket. Im Moment gibt es ein passendes Objekt in einem Anzahl der Sprachen. Es ist einfach, Objekte für andere Software hinzuzufügen Verwenden Sie dieses Protokoll. Im Grunde erstellt diese Firmware ein Protokoll für Sprechen Sie mit dem Arduino von der Host-Software. Das Ziel ist es zu ermöglichen Leute, um den Arduino vollständig von Software auf dem Host zu steuern Computer.
Ja, um diese Zahlen zu senden, müssen Sie sie zuerst in ASCII Zeichenfolgen konvertieren. Wenn Sie mit C arbeiten, ist %code% , IMO, der einfachste Weg, diese Konvertierung durchzuführen:
[Später hinzugefügt: AAAGHH! Ich habe vergessen, dass für %code% / %code% das Input-Argument der Funktion unsigniert werden soll. Dies gilt auch für die Formatzeichenfolge, die an %code% übergeben wurde. Also habe ich es unten geändert. Tut mir leid wegen meiner schrecklichen Aufsicht, die ein schwer zu findender Fehler gewesen wäre. Außerdem macht %code% es etwas allgemeiner.]
%Vor%Und ähnlich für Floats und Doubles. Der Code, der die Umwandlung durchführt, ist im Voraus bekannt. Es muss gesagt werden - welche Art von Entity es konvertiert, also könnten Sie mit den Funktionen %code% und %code% enden.
Sie erhalten eine NUL-terminierte Zeichenkette ohne Links (keine führenden Leerzeichen oder Nullen) aus der Konvertierung.
Sie können die Konvertierung überall / beliebig durchführen. Diese Funktionen sind nur Illustrationen.
Was ist der beste Weg, um %code% , %code% und %code% über die serielle Schnittstelle von Arduino zu senden?
Das %code% sendet nur Werte als ASCII . Aber ich möchte die Werte als Bytes senden. %code% akzeptiert Byte- und Bytearrays, aber was ist der beste Weg, die Werte in Bytes zu konvertieren?
Ich habe versucht, ein %code% auf ein %code% zu setzen, ohne Glück. Ich habe auch memcpy benutzt, aber das benutzt viele CPU-Zyklen. Arduino verwendet einfaches C / C ++. Es ist ein ATmega328 Mikrocontroller.
Das Jargon-Wort, das Sie suchen müssen, ist "Serialisierung".
Es handelt sich um ein interessantes Problem bei einer seriellen Verbindung, bei der die Zeichen, die endweise stehen können, eingeschränkt sind und möglicherweise auch acht Bits pro Zeichen nicht übergeben werden können.
Einschränkungen für bestimmte Zeichencodes sind ziemlich üblich. Hier ein paar aus dem Stegreif:
Wenn die Software-Flusssteuerung verwendet wird, können die Steuerzeichen DC1 und DC3 (Strg-Q und Strg-S, manchmal auch XON und XOFF genannt) konventionell nicht als Daten übertragen werden, da sie an Start und gesendet werden Stoppen Sie den Sender am anderen Ende des Kabels.
Auf einigen Geräten können NUL- und / oder DEL-Zeichen (0x00 und 0x7F) einfach aus dem FIFO des Empfängers verschwinden.
Wenn der Empfänger ein Unix-tty ist und die termio-Modi nicht korrekt eingestellt sind, kann das Zeichen Strg-D (EOT oder 0x04) dazu führen, dass der tty-Treiber ein Dateiende an den Prozess signalisiert das hat die tty geöffnet.
Eine serielle Verbindung ist normalerweise für die Bytebreite und die mögliche Einbindung eines Paritätsbits konfigurierbar. Einige Verbindungen erfordern, dass ein 7-Bit-Byte mit einer Parität anstelle eines 8-Bit-Byte verwandt wird. Es ist sogar möglich, für die Verbindung mit (ernsthaft alter) Legacy-Hardware viele serielle Ports für 5-Bit- und 6-Bit-Bytes zu konfigurieren. Wenn weniger als 8 Bits pro Byte verfügbar sind, ist ein komplizierteres Protokoll erforderlich, um binäre Daten zu verarbeiten.
ASCII85 ist eine beliebte Technik, um sowohl 7-Bit-Daten als auch Einschränkungen bei Steuerzeichen zu umgehen. Es ist eine Konvention zum Umschreiben von Binärdaten mit nur 85 sorgfältig ausgewählten ASCII-Zeichencodes.
Außerdem müssen Sie sich um die Byte-Reihenfolge zwischen Sender und Empfänger kümmern. Sie müssen sich möglicherweise auch um das Fließkommaformat kümmern, da nicht jedes System IEEE-754 Fließkomma verwendet.
Die Quintessenz ist, dass oft die Auswahl eines reinen ASCII-Protokolls die bessere Antwort ist. Es hat den Vorteil, dass es von einem Menschen verstanden werden kann, und ist viel resistenter gegenüber Problemen mit der seriellen Verbindung. Sofern Sie keine Floating-Point-Daten senden, kann die Ineffizienz der Repräsentation durch die Einfachheit der Implementierung aufgewogen werden.
Sei einfach liberal in dem, was du akzeptierst, und konservativ darüber, was du aussendest.
Ist die Größe wichtig? Wenn dies der Fall ist, können Sie jede 32-Bit-Gruppe mit ASCII85 in 5 ASCII-Zeichen codieren, siehe Ссылка .
Vielleicht ist das der beste Weg, Float in Byte und Byte in Float, Hamid Reza, zu konvertieren.
%Vor%Grüße. "
Strukturen und Gewerkschaften lösen dieses Problem. Verwenden Sie eine gepackte Struktur mit einer Einheit in Byte-Größe, die der Struktur entspricht. Überlappen Sie die Zeiger auf die Struktur und die Union (oder fügen Sie die Union in der Struktur hinzu). Verwenden Sie Serial.write, um den Stream zu senden. Habe am Ende eine passende Struktur / Union. Solange die Byte-Reihenfolge kein Problem ergibt, können Sie mit den Funktionen "C" hto (s..l) entpacken. Fügen Sie "header" -Info hinzu, um verschiedene Strukturen / Vereinigungen zu dekodieren.
hm. Wie wäre es damit:
%Vor%Strukturen und Gewerkschaften lösen dieses Problem. Verwenden Sie eine gepackte Struktur mit einer Einheit in Byte-Größe, die der Struktur entspricht. Überlappen Sie die Zeiger auf die Struktur und die Union (oder fügen Sie die Union in der Struktur hinzu). Verwenden Sie Serial.write, um den Stream zu senden. Habe am Ende eine passende Struktur / Union. Solange die Byte-Reihenfolge kein Problem ergibt, können Sie mit den Funktionen "C" hto (s..l) entpacken. Fügen Sie "header" -Info hinzu, um verschiedene Strukturen / Vereinigungen zu dekodieren.
Tags und Links c c++ arduino serial-port bytearray