2016-04-11 5 views
1

Ich schreibe ein C-Programm, das über Modbus TCP kommuniziert. Ich sende den Float 3.14 auf meinem Modbus-Client, mit einer hexadezimalen Darstellung von 0x4048F5C3. Mein C-Code empfängt das Modbus-Paket korrekt und jetzt muss ich nur die unsigned char *buffer als Float neu interpretieren, damit ich den Wert 3.14 erhalten kann. Hier ist mein CodeKann ich bei der Neuinterpretation als Float Endianess angeben?

int main() 
{ 
    setup_modbus_tcp(); 
    unsigned char buffer[4] = { 0x00, 0x00, 0x00, 0x00 }; 
    get_modbus_data(buffer, 4); 
     //Buffer now holds { 0x40, 0x48, 0xF5, 0xC3 }; 
    float value = *(float *)buffer; 
     //value is now -490.564453 
} 

Jetzt kann ich sagen, dass dieses Problem wegen endianness ist, denn wenn ich endianness tauschen, so dass die Puffer wie folgt aussehen:

{ 0xC3, 0xF5, 0x48, 0x40 }; 

dann funktioniert alles einwandfrei. Aber das fühlt sich ein bisschen chaotisch an. Muss ich die Endianz tauschen? Oder gibt es einen Weg, dass ich Endianness angeben kann, wenn ich das tue:

+0

Entweder Sie alle Bytes tauschen müssen oder Sie den Schwimmer als gedruckte ASCII-String senden. –

+0

Auch nach Byte-Swapping: Sind Sie sicher, dass die Darstellung identisch ist? – Olaf

+0

@Olaf Ja, nach dem Byte-Swapping ist es definitiv richtig. Es gibt einen kleinen Unterschied wegen der Fließkomma-Genauigkeit, aber ansonsten ist es richtig. – DJMcMayhem

Antwort

2

Der Puffer muss manuell behandelt werden, dies umfasst Änderungen an Endianess. Es kann immer eine Funktion verwendet werden, die den Puffer in ein Gleitkommaformat konvertiert.

float value = Convert(buffer); 

hinzuzufügen, Sie Weg, um den Puffer der Umwandlung ist falsch:

float value = *(float *)buffer; 

Ein Array von unsigned chars kann nicht einfach sein, zu einem float Typ, da es nicht definiertes Verhalten verursacht. Der Speicher muss auf ein Objekt vom Typ kopiert werden float:

float value; 
memcpy(&value , buffer , sizeof(value)); //assumes endianness has already been handled 
Verwandte Themen