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
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
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.
@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
@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 :-)
Sorry, horse, wollte Dich nicht ärgern, nur die Verwirrung vergrößern :) C ist halt auch nur ein macro assembler (behaupten manche jedenfalls ) Karsten
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.