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.
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 gibthttp://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.
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.