So senden Sie Float über die serielle Schnittstelle

7

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.

    
chriszero 17.07.2010, 09:44
quelle

7 Antworten

9

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

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

    
Pete Wilson 17.07.2010, 10:01
quelle
10

hm. Wie wäre es damit:

%Vor%     
Nils Pipenbrinck 17.07.2010 09:49
quelle
3

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.

    
noonv 07.09.2010 07:30
quelle
2

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.

    
RBerteig 07.09.2010 07:55
quelle
0

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 Ссылка .

    
John Reynolds 17.07.2010 16:39
quelle
0
___ answer3656593 ___

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.

    
___ answer3271018 ___

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.

    
___ qstntxt ___

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.

    
___ qstnhdr ___ So senden Sie Float über die serielle Schnittstelle ___ answer3656782 ___

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.

    
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ tag123serialport ___ Eine serielle Schnittstelle ist eine physikalische Schnittstelle, über die Daten Bit für Bit (uni- oder bidirektional) übertragen werden. Der Begriff bezieht sich normalerweise auf den RS-232-Anschluss mit einem 9-poligen D-Sub-Anschluss, der einst die Standard-serielle Schnittstelle eines PCs war. ___ answer3272352 ___

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 Ссылка .

    
___ tag123bytearray ___ Ein Array ist eine geordnete Datenstruktur, die aus einer Sammlung von Elementen (Werten oder Variablen) besteht, die jeweils durch einen oder mehrere Indizes identifiziert werden. Wenn Sie nach bestimmten Varianten von Arrays fragen, verwenden Sie stattdessen diese verwandten Tags: [Vektor], [Arraylist], [Matrix]. Wenn Sie dieses Tag verwenden, markieren Sie die Frage auch mit der verwendeten Programmiersprache, es sei denn, Ihre Frage bezieht sich nicht auf eine bestimmte Programmiersprache. ___ tag123arduino ___ Arduino ist eine Open-Source-Prototyping-Plattform für Elektronik, die auf einfach zu bedienender Hardware und Software basiert. Fragen sollten sich nur auf Arduinos beziehen (wie in Code enthalten). Allgemeine Arduino-Fragen können unter https://arduino.stackexchange.com gestellt werden ___ antwort23242578 ___

Vielleicht ist das der beste Weg, Float in Byte und Byte in Float, Hamid Reza, zu konvertieren.

%Vor%

Grüße.     "

    
___ answer46647282 ___

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.

    
___ answer3270981 ___

hm. Wie wäre es damit:

%Vor%     
___
Hamid Reza 23.04.2014 11:13
quelle
0

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.

    
Tego 09.10.2017 13:08
quelle

Tags und Links