Forum: Compiler & IDEs float oder double seriell senden


von mex (Gast)


Lesenswert?

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

von Martin (Gast)


Lesenswert?

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

von mex (Gast)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

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.

von mex (Gast)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

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

von mex (Gast)


Lesenswert?

aha, vielen dank

weisst du wo es dazu noch mehr details gibt und v a wie ich den nun 
byteweise sende?

von Karl heinz B. (kbucheg)


Lesenswert?

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.

von Karl heinz B. (kbucheg)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

Ach ja, die Sache mit der union. Hab ich jetzt nicht dran gedacht...

von mex (Gast)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

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