Eine float variable in die einzelnen bits zerlegen und wiede

Gast #21262
Lesenswert?

Hi!

ich muss eine float variable zerlegen um sie mittels RX/TX zu 
verschicken, da man da nur 8 bit schicken kann steh ich vor einem 
problem!

bei int ist es mit << ja recht einfach, nur funktioniert das nicht so 
wie ich will!

sinn der aktion ist das ich einem microcontroller eine gleitkomma zahl 
schicken muss (ein ATMEL 8515)!

ich hab es versucht die vorkomma stelle und die nachkomma stelle einzeln 
zu übertragen!

also zum zerlegen

int vorkomma; (wir sicher ned größer als int)
char nachkomma; (ich brauch nur 2 nachkommastellen)

vorkomma = (int)float
nachkomma = (float - vorkomma)*100

die werden dann an den microcontroller geschickt und so wieder 
zusammengesetzt:

float = vorkomma;
float += nachkomma/100;

wenn ich jetzt allerdings mit

if (float == 123.34) PORTB = 0xFF;

und es liegt sicher am float und nicht an irgendwelchen port 
einstellungen und sonstwas

vor und nachkomma werden auch korrekt übertragen!

dann funktioniert das leider nicht :-(((((
und ich weis ned warum!

thx im vorraus
Bernhard
Gast #21263
Lesenswert?

Hi,

das übertragen der einzelnen bytes geht auch
einfacher, ohne die ganze Rechnerei.

float number;
char *buf = (char*)&number;

for(i=0;i<LEN_OF_FLOAT;++i)
 SEND(buf[i]);

Und weg sind die Daten. LEN_OF_FLOAT ist dabei die Anzahl von bytes in 
einem float (4?) und SEND deine Sendefunktion.

Zu Punkt 2 deines Problems: Man sollte niemals eine float mit == auf 
Gleichheit prüfen, da sich nicht alle Fliesskommazahlengenau darstellen 
lassen. Stattdessen sollte der Vergleich etwa so aussehen:

if(fabs(number-123.34)<EPSILON) PORTB=0xFF;
mit EPSILON <<1 aber > 0 (versuch mal 1e6 oder sowas).

Ich hoffe geholfen zu haben.

 Karsten
#21268
Lesenswert?

Da sind wir wieder beim alten Problem:

Das geht nur solange gut, wie man float auf identische CPUs mit 
identischen Compilern überträgt.

D.h. die Reihenfolge der 4 Bytes ist nicht im C-Standard festgelegt.


Am besten, man überträgt Daten immer in der Networkbyteorder.

Wenn man Glück hat, hat der Compiler schon die dafür nötigen 
Bibliotheksfunktionen:

htons, htonl, ntohs, ntohl

Man bräuchte dann aber noch:

htonf, ntohf



Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren