guten morgen ich möchte gerne einen float oder double per rs-232 übertragen. habe auch einen thread dazu gefunden hier im forum. aber ich steh total am berg.... kann mir jemand netterweise erklären wie byteweise senden kann? vielen herzlichen dank, mex
Du mußt erst den UART initialisieren. Dann Dein Float oder Double in ein String umwandeln. Dann den String zeichenweise über die Schnittstelle schicken. So hab ich das gemacht, ob es noch anders geht weiß ich nicht. P.S. Deine Shift-Taste klemmt wohl...
danke für deine antwort martin so habe ich das bereits auch gemacht per ascii zeichen - nun wüsste ich gerne noch wie es den proprietär geht.... p.s. nein, die kleinen finger klemmen plus der entsprechende sektor in kleinhirn... ev hat das auch einen zusammenhang mit meiner frage oben.. sorry
Im Prinzip hat Martin recht. Es ist die einzige Methode, die immer funktioniert, weil das ASCII-Format standardisiert ist. Wenn man versucht, einen float in mehrere Bytes zu zerlegen, muss man genau wissen, wie die Maschine, auf der man arbeitet die floats darstellt. Außerdem muss man dann auf der Zielmaschine das gleiche umgekehrt machen, und da gehts dann meist völlig daneben, weil unterschiedliche Maschinen unterschiedliche Darstellungen für floats haben. Deshalb: Mit den Funktionen aus der stdlib.h die Variable in einen ASCII-String umwandeln (z.B. mit dtostre bzw. dtostrf), verschicken und in der Zielmaschine mit einer Umkehrfunktion (strtod) wieder zurückverwandeln.
ok, besten dank auch dir johnny ev habe ich mich etwas zu ungenau ausgedrückt : ich würde das empfangsprogramm auf sseite pc auch grad selber schreiben. somit bin ich frei im protokollaufbau und der sollte keine probleme ergeben. allerdings ist mir unklar wie den float zerlegen und überhaupt wie dieser aufgebaut ist (vorzeichen bit, dezimalpunkt ist wie definiert?) besten dank
> ...wie dieser aufgebaut ist...
Das ist ja eins der Probleme: Das ist afaik nirgends Standardmäßig
festgelegt. Generell besteht ein float aus einer Mantisse (die den
Zahlenwert an sich enthält) und einem Exponenten. Wie die jetzt
aufgeteilt sind, kan nunterschiedlich sein (meist ist es glaub ich 24
Bit Mantisse und 8 Bit Exponent). Nen Dezimalpunkt gibt es da überhaupt
nicht. Den macht Dir erst das dtostrf da rein.
aha, vielen dank weisst du wo es dazu noch mehr details gibt und v a wie ich den nun byteweise sende?
Das byteweise senden ist trivial. Alles was du brauchst ist ein byteweiser Zugriff auf den Speicher in dem der float residiert. Das kann man zb so machen: unnion Wandler { float Wert; unsigned char Bytes[ sizeof( float ) ]; }; int main() { float Value = 3.4; union Wandler wandel; wandel.Wert = Value; for( i = 0; i < sizeof( float ); ++i ) { Sende_ein_byte( wandel.Bytes[i] ); } } Aber wie schon angeklungen: Das ist meist keine gute Idee, weil verschiedene Rechnerarchitekturen, verschieden Compiler u.ä. unterschiedliche Auffassungen haben können, welches Byte nun konkret was bedeutet.
> weisst du wo es dazu noch mehr details gibt
Details findest du, indem du die Handbücher deiner
Compiler studierst und rausfindest welche Floating
Point Repräsentierung diese Compiler benutzen.
Danach heist es, die Spezifikationen dieses
Formatszu besorgen und die miteinander zu vergleichen.
> weisst du wo es dazu noch mehr details gibt http://de.wikipedia.org/wiki/IEEE_754 Aber wie gesagt, den Standard gibts zwar, aber es gibt auch ne Menge Ermessensspielraum bei der Umsetzung. > ...v a wie ich den nun byteweise sende? Ich habe noch nicht ausprobiert, was passiert, wenn man versucht, auf einen float mit Bitshift-Operationen zuzugreifen. Das ist auch afaik nicht definiert, deshalb auch der Hinweis oben auf die Übertragung als ASCII-String, die zwar dazu führt, dass mehr Datenvolumen übertragen werden muss, die aber andererseits gewährleistet, dass der Wert auch zuverlässig auf jedem System in die ursprüngliche Zahl zurückverwandelt werden kann.
Ach ja, die Sache mit der union. Hab ich jetzt nicht dran gedacht...
ups, allerhand infos , super!!! danke schon mal union habe ich bis anhin auch noch gekannt, nun scheint es zeit dafür zu werden.... benutze den avr-gcc, dessen float spezifikationen suche ich grad noch...
Das mit der union würde ich auch so machen. Bleibt zu überlegen, ein weiteres Byte zu übertragen, welches die Reihenfolge der Bytes anzeigt. Je nach CPU kann LSB oder MSB an niedrigster Speicheradresse stehen. Die Information, in welchem Format die Ausgabe erfolgt, kann daher für unterschiedliche Plattformen hilfreich sein.
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.