Forum: Mikrocontroller und Digitale Elektronik Eine float variable in die einzelnen bits zerlegen und wiede


von Montolio (Gast)


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

von Karsten (Gast)


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

von crazy horse (Gast)


Lesenswert?

eine float-Zahl besteht aus 4 Byte, und mit den Konvertierungen wäre ich 
ganz vorsichtig.
Ich habs irgendwann mal mit einer kleinen Assemblerroutine gelöst, 
Adresse der Variablen übergeben, dieses Byte und die nachfolgenden 3 
senden, ohne jede Konvertierung.

von Karsten (Gast)


Lesenswert?

@crazy horse

... was genau das ist, was der C-Code da oben tut.
Konvertiert wird da nichts (außer dem Typ des Zeigers auf den float)

 Karsten

von crazy horse (Gast)


Lesenswert?

@Karsten
als ich das geschrieben habe, war dein Beitrag noch nicht da, 
Konvertierung bezog sich auf Vorkomma/Nachkomma von Montolino. Deine 
Lösung ist natürlich eleganter, meine stammt noch aus der Zeit, als ich 
gerade mit C angefangen habe und mir solche Konstrukte noch nicht 
geläufig waren :-)

von Karsten (Gast)


Lesenswert?

Sorry, horse,

wollte Dich nicht ärgern, nur die Verwirrung
vergrößern :)
C ist halt auch nur ein macro assembler (behaupten manche jedenfalls )

Karsten

von Peter D. (peda)


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

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.