我通过UART从ST MCU中获取数据,并在PC屏幕上显示值,但是结果与我在float类型中的预期不同。
我将TrueStudio用于ST MCU和C#在屏幕上显示值。 我在MCU上使用浮点值并将数据发送到PC 当我进入PC时,如果我向textBox显示浮点值,则其结果与我预期的太不同了。 在TrueStudio内存视图和观看视图中,我可以在下面看到
在TrueStudio MCU中,我可以看到
我可以通过C#中的Visual Studio在PC中获取此数据
我可以通过观察窗口看到byte []数组数据,并且可以看到我得到的
private void makeItemRightClickListener()
{
grid.addCellPreviewHandler(new CellPreviewEvent.Handler<T>() {
@Override
public void onCellPreview(CellPreviewEvent<T> event)
{
if (event.getNativeEvent().getButton() !=
NativeEvent.BUTTON_RIGHT)
return;
// Prevent browser's own context menu from appearing
event.getNativeEvent().preventDefault();
event.getNativeEvent().stopPropagation();
handleItemRightClickEvent(event);
}
});
}
private void handleItemRightClickEvent(CellPreviewEvent<T> event)
{
NativeEvent nativeClickEvent = event.getNativeEvent();
// Get the data (type T) that is being displayed in the cell
// by the CellTable or DataGrid widget.
T rowClicked = event.getValue();
// Create PopupPanel for menu
PopupPanel popup = ...
// Show the popup menu at the click position
UIObject target = new MousePointUIObject(nativelickEvent);
popup.showRelativeTo(target);
}
private static class MousePointUIObject extends UIObject
{
private NativeEvent mouseEvent;
public MousePointUIObject(NativeEvent mouseEvent)
{
this.mouseEvent = mouseEvent;
}
@Override
public int getAbsoluteLeft()
{
return mouseEvent.getClientX() + Window.getScrollLeft();
}
@Override
public int getAbsoluteTop()
{
return mouseEvent.getClientY() + Window.getScrollTop();
}
@Override
public int getOffsetWidth()
{
return 0;
}
@Override
public int getOffsetHeight()
{
return 0;
}
}
我用这些值转换了此值,但我无法获得想要的5.124
msg[4] = 0xCF, msg[5] = 0xF7, msg[6] = 0xA3, msg[7] = 0x40
将dec转换为UInt32
str = "3489112896"
Convert.ToDouble(str) = 2246812992
在TrueStudio中,复制如下(在C中)
u32 = Convert.ToDouble(str)
u32 = 0xcff7a340
(double)u32 = 3489112896
(float)u32 = 3.48911283E+09
BitConverter.ToSingle(BitConverter.GetBytes((int)u32), 0) = -2.21599971E-35
在Visual Studio中,C#
memcpy(ðBuf[len], &g_Bsp.acc, sizeof(ACC_ST));
len += sizeof(ACC_ST);
我先尝试过MSB / LSB,但无法获得想要的东西。 如何在C#中获得5.123浮动值?
答案 0 :(得分:1)
您可以使用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
检查字节序。