Forum: Mikrocontroller und Digitale Elektronik float über uart, momentan betriebsblind


von Ert (Gast)


Lesenswert?

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

von Avr N. (balze)


Lesenswert?

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

von Svenska (Gast)


Lesenswert?

Floats sind in ihrer Bitreihenfolge nicht genau definiert. Der Typecast 
könnte funktionieren. Sicher ist nur eine Darstellung über 
ASCII-Strings.

von Chris (Gast)


Lesenswert?

sscanf ist der einfachste aber auch der resscourcenfressenste Weg :-)

von Avr N. (balze)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

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

von Ert (Gast)


Lesenswert?

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

von Ogni (Gast)


Lesenswert?

typedef union
{
    char buf[4];
    float f;
} conv_t;

So sind die eingelesenen bytes und der float an derselben Adresse

von Kaj (Gast)


Angehängte Dateien:

Lesenswert?

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
}

von Mike (Gast)


Lesenswert?

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

von Ert (Gast)


Lesenswert?

f@ttes danke in die Runde!

Mit
static union {
uint8_t temp_array[4];
float fval;
}conv;
gehts.

von Dirk B. (dirkb2)


Lesenswert?

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
Noch kein Account? Hier anmelden.