2016-04-11 4 views
1

私はmodbus TCP上で通信するCプログラムを書いています。 modbusクライアントに浮動小数点3.14を送り、16進表現は0x4048F5C3です。私のCコードは正しくModbusパケットを受信して​​います。今度はをfloatとして再解析する必要がありますので、値3.14を得ることができます。フロートとして再解釈する際にエンディアンを指定できますか?

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

その後、すべてが正常に動作します:ここでは、バッファは次のようになりますように、私はエンディアンを交換する場合ので、私は、この問題は、エンディアンであることを伝えることができ、今、私のコード

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 
} 

です。しかし、これはちょっと面倒です。私はエンディアンを交換しなければなりませんか?それとも私が行うとき、私はエンディアンを指定することができる方法がある:バッファは手動で処理しなければならない

float value = *(float *)buffer; 
+0

すべてのバイトをスワップするか、浮動小数点を印刷されたASCII文字列として送信する必要があります。 –

+0

バイトスワップ後:表現が同一であることを確認していますか? – Olaf

+0

@Olafはい、バイトスワップ後、間違いなく正しいです。浮動小数点精度のためにわずかな違いがありますが、それ以外は正しいです。 – DJMcMayhem

答えて

2

、これはエンディアンへの変更が含まれています。バッファを浮動小数点形式に変換する関数を常に使用することができます。

float value = Convert(buffer); 

追加するには、バッファを変換するあなたの方法が間違っています:

float value = *(float *)buffer; 

それは未定義の動作を引き起こすので、符号なしcharの配列は、float型に簡単にすることはできません。メモリは、タイプfloatのオブジェクトにコピーする必要があります。

float value; 
memcpy(&value , buffer , sizeof(value)); //assumes endianness has already been handled 
関連する問題