Hallo zusammen,
ich hoffe, dass ich im richtigen Forum bin.
Ich bin noch nicht so die Leuchte in C. Eventuell stellt euch mein
Problem vor keine großen Herausforderungen, aber ich stehe noch am
Anfang.
Ich möchte eine Float Variable wortweise swappen und ich weiß nicht wie.
Also so:
Von von (Byte1,Byte2,Byte3,Byte4) nach (Byte3,Byte4,Byte1,Byte2).
Wie bekomme ich das bei Float hin. Bei einem 32 Bit unsigned integer
kann ich es mir noch vorstellen. Aber wie geht es bei Float-Variablen?
Danke für eure Hilfe
Danke.
Ich kenne memcopy noch nicht, muss mich damit beschäftigen.
Ich dachte schon an eine union, geht das auch?
Manche Modbus Geräte wollen es anders herum.
Es ist mir auch nicht so klar warum!
C-Anfänger schrieb:> Manche Modbus Geräte wollen es anders herum.> Es ist mir auch nicht so klar warum!
dort sendest du es doch auch byteweise oder nicht? Dann kannst du doch
dort einfach die Bytes tauschen.
Eigentlich ist Modbus Wort-orientiert. Man sendet eigentlich nur 16
Bit-Werte.
Es ist meines Wissens nicht genau definiert wie float übertragen werden
(also 2 Wörter).
Daher macht es auch nicht jeder Hersteller gleich.
Die Anzeige die ich ansteuern will macht es halt anders herum.
C-Anfänger schrieb:> Eigentlich ist Modbus Wort-orientiert. Man sendet eigentlich nur 16> Bit-Werte.
dann tausche doch einfach die beiden Words beim senden und empfangen.
Dafür musst du doch nicht die Float umdrehen.
Jetzt weiß ich was du meinst.
Mein Problem ist:
Ich habe eine Float Varibale:
z.B.
float x;
Wie zerpflücke ich die Variable in zwei einzelne 16 Bit Werte.
C-Anfänger schrieb:> Ich möchte eine Float Variable wortweise swappen
Warum solltest du ?
Der Wert geht dabei kaputt.
Du tauscht einige Mantissenbits mit Exponentenbits,
aus 3.14526e+4 wird vielleicht -9.887e-25 oder was anderes.
Hallo,
hier ein Beispiel, wie es funktionieren könnte:
1
unionconvert_t// union to access the same memory location as float or byte array
2
{
3
floatfValue;// float ist auf meinem System 4 Byte lang
4
int32_tlValue;
5
uint32_tulValue;
6
uint8_tbValue[sizeof(float)];
7
};
und später im Programm:
1
uint8_tc;
2
floatf;
3
unionconvert_tConv_value;
4
f=1.2345;
5
Conv_value.fValue=f;
6
c=Conv_value.bValue[3];
7
Conv_value.bValue[3]=Conv_value.bValue[4];
8
Conv_value.bValue[4]=c;
9
f=Conv_value.fValue;
ich schließe mich aber meinem Vorredner an: Erklär lieber, warum du es
machen willst. Little <==> Big Endian Konvertierung für floats?
Gerhard
PS: statt uint8_t kannst du sicher auch char nehmen.
Michael B. schrieb:> Du tauscht einige Mantissenbits mit Exponentenbits,> aus 3.14526e+4 wird vielleicht -9.887e-25 oder was anderes.
Genau das will ich machen!
Natürlich geht der Wert kaputt, aber wenn der Busteilnehmer es eben so
will. Das Display interpretiert es eben falsch herum.
C-Anfänger schrieb:> Geht es auch so?
Standardkonform geht es mit Union nicht, sie ist nicht dafür gedacht.
Warum willst du immer noch die float umdrehen, sende die beiden words
einfach in andere Reihenfolge.
Dafür braucht man keine Union, das sind 3 Zeilen fürs senden und noch
mal 3 Zeilen fürs empfangen. Portabel und allgemein gültig.
Senden:
helfer schrieb:> Wenn, dann so:
Du hast recht. Sorry!
Peter II schrieb:> Dafür braucht man keine Union, das sind 3 Zeilen fürs senden und noch> mal 3 Zeilen fürs empfangen. Portabel und allgemein gültig.
Du hast ja auch recht. Aber ich kannte die Union vorher nicht wirklich.
Jetz möchte ich sie einfach verstehen.
Peter II schrieb:> Standardkonform geht es mit Union nicht, sie ist nicht dafür gedacht.
Für was ist sie dann gedacht?
C-Anfänger schrieb:> Für was ist sie dann gedacht?
um Speicher zu sparen.
Man sollte/darf nur die variabel auslesen die man vorher auch
geschrieben hat.
Dann kann es noch Probleme bei Alignment gehen, auf einigen System muss
float an gewissen Speicheradressen ausgerichtet sein, das geht dann bei
einer Union nicht mehr.
Peter II schrieb:> Warum willst du immer noch die float umdrehen, sende die beiden words> einfach in andere Reihenfolge.
Üblicher Weise bastelt man erst ein komplettes Paket und übergibt der
Sendefunktion nur den Pointer darauf. Es können ja mehrere Tasks
gleichzeitg senden wollen.
Peter D. schrieb:> Üblicher Weise bastelt man erst ein komplettes Paket und übergibt der> Sendefunktion nur den Pointer darauf. Es können ja mehrere Tasks> gleichzeitg senden wollen.
wenn man genug speicher hat ja, wenn man mehre stellen hat die Senden
können muss mit sperren arbeiten.
Aber auch dann kann man es genau machen, statt Send() füllt man man sein
puffer-byte-Array ab.