float oder double seriell senden

Gast #462179
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...
Gast #462186
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
Gast #462191
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.
Gast #462207
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
Gast #462214
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.
#462252
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.
#462254
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.
Gast #462255
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.
Gast #462287
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...
Gast #462354
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.

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