2017-06-04 59 views
-1

我目前正試圖通過USB發送漂浮物。 的PC具有與DEBUGLOG函數I可以清楚地看到一系列字節穿過與根據此網站下列順序STM32通過USB從PC上漂浮,終結困難

.. 00 00 00 40 .. 

運行下面的代碼

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

Qt應用程序

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未打開。

這是一個endianess問題嗎? 我如何獲得浮點值2.0?

問候,

+1

將漂浮物作爲ASCII文本發送,並將它們轉換回另一端。它更安全,更簡單。 – ThingyWotsit

+0

帶終止字符(「CR」或「NUL」)的「2.0」與單個字符的大小相同,只要雙方都知道該協議,然後就可以與任何事情進行大多數通信,就不會輕易被誤解。此外,使用終止字符的協議避免了流式連接的問題,其中rx調用返回的'早'字節數少於完整消息/浮點數所需的字節數。 – ThingyWotsit

+0

你能舉個例子嗎? – Luigi

回答

1

對於IEEE 754浮點數的字節順序是通常不是一個問題,但檢查只是要確定。

您的主要問題是閱讀值。你是整型算術中的ORing值,並得到一個整數值,這是正確的,但你轉換爲它浮動。這將總是給垃圾,除了0.

你需要重新解釋爲浮動。您可以使用:

  • 指針轉換: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是一個近似值。最好避免==,並改用> >= < <=。如果你想檢查一個特定的值而不是一個範圍,檢查一下你的值的範圍足夠小,範圍與你的精度需求相匹配。

+0

我會試一試並報告回來。無論如何,我認爲給定的uint32只能轉化爲固定的浮動。不是嗎? – Luigi

+0

@Luigi是的,每個uint32都可以代表一個有效的,不同的浮點數。雖然通過轉換,你只能得到浮點範圍的一小部分,而不是你想要的。例如,「1.0f」表示爲「0x3F800000」,如果您將其轉換爲**,則該整數不會給出「1.0」。 – ElderBug

+0

是否有一個快捷方式只與數組元素一起工作? – Luigi