私は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;
すべてのバイトをスワップするか、浮動小数点を印刷されたASCII文字列として送信する必要があります。 –
バイトスワップ後:表現が同一であることを確認していますか? – Olaf
@Olafはい、バイトスワップ後、間違いなく正しいです。浮動小数点精度のためにわずかな違いがありますが、それ以外は正しいです。 – DJMcMayhem