www.mikrocontroller.net

Forum: Compiler & IDEs float oder double seriell senden


Autor: mex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: mex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: mex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: mex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aha, vielen dank

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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: johnny.m (Gast)
Datum:

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

Autor: mex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.