LabVIEWForum.de - 4 Bytes zu float

LabVIEWForum.de

Normale Version: 4 Bytes zu float
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo @ all

Ich habe auf meinem Mikrocontroler einen Sinuswert ausgerechnet. Diese hat den Datentype float(4Bytes). Ich habe die 4 BYtes jetzt per RS232 an den PC gesendet. Jetzt möchte ich aus dem Bytearray wieder einen float erzeuegen jedoch weiß ich nicht wie.

Kann mir einen einen Tip geben.
Wenn es nur vier Bytes sind geht auch das "Join Numbers" VI von der Data Manipulation Palette. Ansonsten Byte Array in Float Array Type casten. Dabei muss man auf die Byte-Order achten (big endian / little endian) und ggf. mit Byte-swap und Word-swap anpassen.
Mit der TypeCast Funktion habe ich noch nie gearbeitet und die Beschreibung finde ich nicht besonders übersichtlich. Kann mir vieleicht jemand ein kleines Beispiel erzeugen?
Man kann den String entweder als 4-Byte-String schicken (oberes Beispiel). Dann kommen aber alle Zeichen von ASCII 0..255 vor und man hat keinerlei Steuerungsmöglichkeiten bei der Übertragung (z.B. Termination Char)
Oder als HEX-String - dann sind es aber 8 Byte (unteres Beispiel)
[attachment=30274]
Das Ganze funktioniert natürlich nur, wenn Du die gesamte Datenkette selbst im Griff hast. Wenn Du dich mit irgendeinem vorgegebenen 4-Byte Format für die SGL-Zahl abfinden mußt, dann kann die Rückwandlung komplizierter werden.

Information zur Typecast-Funktion: Jede Variable oder Konstante besteht intern aus den eigentlichen Daten (bei Type SGL sind das 4 byte), und der Typbeschreibung (Hier: daß es sich bei den 4 Byte um eine SGL-Zahl handelt). Die Typecast macht mit den Daten gar nichts, sondern unterjubelt den Daten nur eine andere Typbeschreibung. Sie ist deshalb eine sehr schnelle und leistungsfähige Funktion, aber mit Vorsicht zu verwenden, da sonst Unvorhergesehenes herauskommen kann.
Ich glaube wir haben uns falsch verstanden.

Ich habe z.B. eine float Zahl 2.345325. Diese ist 4 Byte groß. Jetzt übertrage ich zuerst von den 32Bit das Datenbit 0 bis 7. Anschließend das Datenbit 8 bis 15, dann 16 bis 23 und zum Schluß 24 bis 31.

Von der RS232 Schnittstelle bekomme ich jetzt 4 Bytes. Diese muss ich jetzt in der richtigen Reihenfolge wieder zusammensetzen und dann in einen float casten. Dies hat jedoch bis jetzt leider noch nicht richtig funktioniert.
[attachment=30277]
Gruß, Jens
Ja wenn Dein µC von der 4-byte-SGL-Zahl ein anderes 32-bit-Format sendet als ich im Beispiel angenommen habe, dann muß Du natürlich die Prozedur was der µC genau macht erst mal verraten, bevor an eine qualifizierte Antwort zu denken ist.

Das Beispiel von Jens ist übrigens auch nichts anderes, nur daß dort nicht darauf eingegangen ist, daß eine RS232-Übtragung immer als ASCII-Zeichenkette erfolgt und nicht als parallele 4 Byte.
Ich habe es wie folgt gemacht:

wäre: float test = 2.4536;

putchar( ((uint8_t*)&test)[0] );
putchar( ((uint8_t*)&test)[1] );
putchar( ((uint8_t*)&test)[2] );
putchar( ((uint8_t*)&test)[3] );


Ich habe es auch geschaft auf der PC Seite wie Jens G. wieder in eine float Zahl zurückgewamdelt.

Wenn ich vom µC aus die Zahl 2.4536 nehme dann geht es auch

Auch die Zahl -19,23468 geht

Wenn ich jedoch die Zahl 987619,23468 nehme dann geht es nicht mehr, obwohl es doch noch im Zahlenbereich liegt. Ich weiß bis jetzt noch nicht woran es liegt.
Hallo Joe,

Zitat:Zahl 987619,23468
Diese Genauigkeit bei einem SGL ist einfach nur Quatsch... Aber nichtsdestotrotz: was für Zeichen schickt denn dein µC bei einer solchen Zahl? Entweder liegt der Fehler schon dort oder (unwahrscheinlich) bei LabVIEW beim Zurückwandeln...
Seiten: 1 2
Referenz-URLs