Я получаю данные от ST MCU через UART и отображаю значение на экране ПК, но его результат отличается от того, что я ожидал в типе с плавающей запятой.
Я использую TrueStudio для ST MCU и C# для отображения значений на экране. Я использую значение с плавающей запятой в MCU и отправляю данные на ПК Когда я попадаю на ПК, если я отображаю значение с плавающей запятой в текстовом поле, его результат слишком отличается от ожидаемого. В представлении памяти TrueStudio и представлении просмотра я вижу ниже
В TrueStudio MCU я вижу
Я мог бы получить эти данные на ПК через визуальную студию на С#.
Я вижу данные массива byte[] через окно просмотра и вижу, что получил
msg[4] = 0xCF, msg[5] = 0xF7, msg[6] = 0xA3, msg[7] = 0x40
Я преобразовал это значение с помощью этих, но не смог получить то, что хотел, 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(ðBuf[len], &g_Bsp.acc, sizeof(ACC_ST));
len += sizeof(ACC_ST);
В визуальной студии С#
UInt32 u32 = (UInt32)( msg[4] | (msg[5] << 8) | (msg[6] << 16) | (msg[7]<<24));
LOG("u32 : " + u32 + "\n");
Сначала я пробовал с MSB/LSB и не смог получить то, что хотел. Как я могу получить 5.123 с плавающей запятой в С#?
Вы можете преобразовать наговорить, используя BitConverter.GetBytes
и BitConverter.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
.