STM32从PC上浮过USB,结束了挣扎

时间:2017-06-04 11:02:02

标签: c++ qt floating-point stm32 endianness

我正在尝试通过USB发送浮动。 PC有一个运行以下代码的Qt应用程序

float x = 2.0;
memcpy(buffer.data() + 14, &x,  sizeof x);

使用debuglog函数我可以清楚地看到通过以下顺序传递的字节序列

.. 00 00 00 40 ..

根据这个网站

http://www.scadacore.com/field-tools/programming-calculators/online-hex-converter/

如果没有少量的结束,

会转换为1073741824。

在我的STM32上我可以使用以下代码然后打开LED4

uint32_t a = buffer[14] | (buffer[15] << 8) | (buffer[16] << 16) | (buffer[17] << 24);                      
if (a == 1073741824){
    HAL_GPIO_WritePin(LED4_PORT, LED4_PIN, GPIO_PIN_RESET);
}

当我想转换为实际浮动值2.0

时出现问题 事实上,如果我这样做

float b = buffer[14] | (buffer[15] << 8) | (buffer[16] << 16) | (buffer[17] << 24);
if (b == 2.0f){
    HAL_GPIO_WritePin(LED5_PORT, LED5_PIN, GPIO_PIN_RESET);
}

LED5没有开启。

这是一个结束问题吗? 我怎样才能获得浮动值2.0?

此致

1 个答案:

答案 0 :(得分:1)

对于IEEE 754浮点数,结束语通常不是问题,但请检查以确定。

你的主要问题是阅读价值。你是整数运算中的ORing值并获得一个整数值,这是正确的,但是你转换为float。除了0之外,这总是会产生垃圾。

您需要将其重新解释为float。您可以使用:

  • 投射指针:float a = *(float*)&myInt;
  • memcpymemcpy(&myFloat, &myInt, 4);
  • 工会:union { uint32_t i; float f; };u.i = myInt; float f = u.f;

比较浮点时还需要小心。写if( f == 2.0f )通常是个坏主意,因为2.0f是近似值。最好避免==,而是使用> >= < <=。如果您想检查特定值而不是范围,请检查您的值周围足够小的范围,您的范围符合您的精度需求。