0

ST MCU から UART 経由でデータを取得し、値を PC 画面に表示していますが、float 型で期待した結果とは異なります。

画面に値を表示するために、TrueStudio for ST MCU と C# を使用しています。MCUでfloat値を使ってPCにデータを送信しているのですが、PCに入ってテキストボックスにfloat値を表示すると、思っていた結果と違いすぎます。TrueStudio のメモリ ビューとウォッチ ビューでは、以下のように表示されます。

  1. TrueStudio MCU では、

    • ウォッチ ウィンドウ: acc.x = 5.12400007
    • メモリ ビュー: 浮動小数点形式の 5.124000E0 16 進数形式の CFF7A340
  2. C#のビジュアルスタジオを介してPCでこのデータを取得できました

    • ウォッチ ウィンドウで byte[] 配列データを確認でき、取得したことがわかります

      msg[4] = 0xCF, msg[5] = 0xF7, msg[6] = 0xA3, msg[7] = 0x40
      
    • 12 月には 3489112896
    • この値をこれらで変換しましたが、必要なものが得られませんでした, 5.124

      str = "3489112896"
      Convert.ToDouble(str) = 2246812992
      

      dec を UInt32 に変換したので

      u32 = Convert.ToDouble(str)
      u32 = 0xcff7a340
      (double)u32 = 3489112896
      (float)u32 = 3.48911283E+09
      BitConverter.ToSingle(BitConverter.GetBytes((int)u32), 0) = -2.21599971E-35
      

    TrueStudio では、以下のようにコピーします (C で)

    memcpy(&ethBuf[len], &g_Bsp.acc, sizeof(ACC_ST));
    len += sizeof(ACC_ST); 
    

    ビジュアル スタジオでは、C#

    UInt32 u32 = (UInt32)( msg[4] | (msg[5] << 8) | (msg[6] << 16) | (msg[7]<<24));
    LOG("u32 : " + u32 + "\n");    
    

    最初に MSB/LSB で試してみましたが、望みどおりの結果が得られませんでした。C#で5.123浮動小数点値を取得するにはどうすればよいですか?

4

1 に答える 1

1

andを使用して 16 進数に変換できます。BitConverter.GetBytesBitConverter.ToString

public static string FloatToHex(float val)
{
    var bytes = BitConverter.GetBytes(val);
    return BitConverter.ToString(bytes).Replace("-", string.Empty);
}

また、データを配列に変換してから次を使用することで、16 進数から変換し直すことができます。byteBitConverter.ToSingle

public static float HexToFloat(string hexVal)
{
    byte[] data = new byte[hexVal.Length / 2];
    for (int i = 0; i < data.Length; ++i)
    {
        data[i] = Convert.ToByte(hexVal.Substring(i * 2, 2), 16);
    }
    return BitConverter.ToSingle(data, 0);
}

オンラインで試す

データを交換するシステムによっては、エンディアンを考慮して、それに応じてバイトの順序を逆にする必要がある場合があります。を使用してエンディアンを確認できますBitConverter.IsLittleEndian

于 2019-05-30T01:51:37.690 に答える