我正在尝试通过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上我可以使用以下代码然后打开LED4uint32_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?
此致
答案 0 :(得分:1)
对于IEEE 754浮点数,结束语通常不是问题,但请检查以确定。
你的主要问题是阅读价值。你是整数运算中的ORing值并获得一个整数值,这是正确的,但是你将转换为float。除了0之外,这总是会产生垃圾。
您需要将其重新解释为float。您可以使用:
float a = *(float*)&myInt;
memcpy
:memcpy(&myFloat, &myInt, 4);
union { uint32_t i; float f; };
,u.i = myInt; float f = u.f;
比较浮点时还需要小心。写if( f == 2.0f )
通常是个坏主意,因为2.0f
是近似值。最好避免==
,而是使用> >= < <=
。如果您想检查特定值而不是范围,请检查您的值周围足够小的范围,您的范围符合您的精度需求。