1

Modbus TCP を介して通信する C プログラムを作成しています。3.14の 16 進表現で、modbus クライアントにfloat を送信します0x4048F5C3。私の C コードは modbus パケットを正しく受信しておりunsigned char *buffer、値を取得できるように を float として再解釈する必要があります3.14。これが私のコードです

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
}

これで、この問題はエンディアンが原因であることがわかります。バッファが次のようになるようにエンディアンを交換すると、次のようになります。

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

その後、すべて正常に動作します。でもこれはちょっと面倒くさい気がします。エンディアンを交換する必要がありますか? または、エンディアンを指定する方法はありますか:

float value = *(float *)buffer;
4

1 に答える 1

2

バッファーは手動で処理する必要があります。これには、エンディアンの変更が含まれます。バッファを浮動小数点形式に変換する関数は常に使用できます。

float value = Convert( buffer );

追加するには、バッファを変換する方法が正しくありません:

float value = *(float *)buffer;

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

float value;
memcpy( &value , buffer , sizeof( value ) );  //assumes endianness has already been handled
于 2016-04-11T15:23:17.153 に答える