0

我通过 UART 从 ST MCU 获取数据并将值显示到 PC 屏幕,但其结果与我对浮点类型的预期不同。

我正在使用 TrueStudio for ST MCU 和 C# 在屏幕上显示值。我在 MCU 上使用浮点值并将数据发送到 PC 当我进入 PC 时,如果我向 textBox 显示浮点值,它的结果与我的预期相差太大。在 TrueStudio 内存视图和观察视图中,我可以看到下面

  1. 在 TrueStudio MCU 中,我可以看到

    • 在观察窗口中:acc.x = 5.12400007
    • 在内存视图中:浮点格式的 5.124000E0 十六进制格式的 CFF7A340
  2. 我可以通过 C# 中的 Visual Studio 在 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转换为十六进制BitConverter.GetBytesBitConverter.ToString

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

您可以通过将数据转换回数组来从十六进制byte转换回来,然后使用BitConverter.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 回答