Hallo ich bekommen seriell auf meinen Mega88 einen Floatwerte mit 4x8Bytes... Wie kann ich jetzt den char[4] in ein float pressen, bin momentan betriebsblind ;-) Muss ich das nach http://de.wikipedia.org/wiki/IEEE_754 (Abschnitt: erechnung IEEE754-Gleitkommazahl → Dezimalzahl) machen, oder geht das über eine Lib in WINAVR, welche ich noch nicht kenne. Wer schickt den auch schon Floatwerte, pfui Gruß Ert
Ich bin kein C Experte, meine Idee waere die 4 Byte in einen Struct packen, und diesen dann nach float typecasten. MfG balze aka AVR Noob
Floats sind in ihrer Bitreihenfolge nicht genau definiert. Der Typecast könnte funktionieren. Sicher ist nur eine Darstellung über ASCII-Strings.
sscanf ist der einfachste aber auch der resscourcenfressenste Weg :-)
Vielleicht muesste Ert nochmal genau darlegen wie der float den uebertragen wird. Werden die einzelnen Dezimalstellen als ASCII Zeichen oder werden die 4 Byte aus dem der float besteht uebertragen? Oder noch anders? MfG balze aka AVR Noob
@ Ert (Gast) >ich bekommen seriell auf meinen Mega88 einen Floatwerte mit 4x8Bytes... In welcher Form? Als ASCII-Zeichen? Denn 32 byte ist arg viel. Oder in Binärform? >Wie kann ich jetzt den char[4] in ein float pressen, bin momentan >betriebsblind ;-) Wenn du den float schon binär bekommst, dann schon. >Muss ich das nach http://de.wikipedia.org/wiki/IEEE_754 (Abschnitt: >erechnung IEEE754-Gleitkommazahl → Dezimalzahl) machen, NEIN! >oder geht das >über eine Lib in WINAVR, welche ich noch nicht kenne. Ja. sscanf kann das. Oder atof() aus stdlib.h, das sit deutlich resourcenschonender.
i be back. Ich hasse IKEA am Freitag -.- dauert immer viel zu lang bis man da wieder raus ist Zurück zum Thema. Es sind natürlich 4x8bits also 4Bytes, entschuldigt den Fehler im ersten Satz oO. Ich hab also ein char, beispielweise: tempchar[4] = {0x34, 0x45, 0x56, 0x67}; Das erste Bit ist das Vorzeichen usw. aber wie würdet ihr jetzt elegant ein int bzw ein float aus den char machen? Danke für die Hilfe <3
typedef union { char buf[4]; float f; } conv_t; So sind die eingelesenen bytes und der float an derselben Adresse
1 | int main(void) |
2 | {
|
3 | union VAL |
4 | {
|
5 | float fVal; |
6 | int8_t iVal[4]; |
7 | };
|
8 | VAL u_val; |
9 | |
10 | u_val.fVal = 3.1415; |
11 | |
12 | u_val.iVal[0] = 0x34; |
13 | u_val.iVal[1] = 0x45; |
14 | u_val.iVal[2] = 0x56; |
15 | u_val.iVal[3] = 0x67; |
16 | }
|
Kaj schrieb: > int main(void) > { > union VAL > ... Wenn der Code für Sender- und Empfänger-µC mit dem selben Compiler erzeugt wird und hat man sogar gute Chancen, dass das funktioniert. Sonst halt 50:50
f@ttes danke in die Runde! Mit static union { uint8_t temp_array[4]; float fval; }conv; gehts.
Ert schrieb: > Ich hab also ein char, beispielweise: > > tempchar[4] = {0x34, 0x45, 0x56, 0x67}; Es muss nicht die Union sein. Ein cast tut es auch
1 | float f; |
2 | f = *(float*)tempchar; |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.