2017-06-15 124 views
0

我試圖HEX的字符串轉換爲一個浮點值。該字符串是4個字節長。它被定義爲:Arduino的字符串浮動

String B = ""; 

這是一個較長的字符串的子:

B = input.substring(6,14); 

這導致我試圖在轉換爲單精度浮點值的字符串中。
網上我發現下面的代碼:

float y = *(float*)&B; 

這編譯沒有錯誤,但是當我運行的代碼,它總是0.000000。我猜我不能用一個字符串使用該函數。典型的字符串可以是"bb319ba6",其應該是-0.002710083。爲此,我使用的是我在網上找到的IEEE 754轉換器。

基本上,我需要做的Arduino的相同的轉換。我希望有人能幫助我。

+0

解碼問:你爲什麼不只是擺在首位進入你的浮點值,這樣? – spectras

+0

我看到你已經包含了IEEE-754標籤。該規範在matissa佈局,指數和所使用偏差的定義中是明確的。您需要做一些冗長的按位操作,但可以完成。遵循規範。 – TomServo

+0

有一個帶有ADC的放大器,用於連接到Arduino的力傳感器。我得到的輸入數據是單個字節,然後我將其放入一個字符串中。 – LostInTechnology

回答

0

你真的不應該使用這些限制-RAM Arduinos String。它可能會導致奇怪的錯誤,並在隨機時間後掛起(更多信息here)。只需使用字符數組來保存從傳感器接收到的字符。下面是一些代碼,將與任何Stringchar[]工作:

uint8_t fromHex(char c) 
{ 
    if ((0 <= c) && (c <= '9')) 
    return (c - '0'); 
    if ('A' <= c) && (c <= 'F')) 
    return (c - 'A'); 
    if ('a' <= c) && (c <= 'f')) 
    return (c - 'a'); 
    return 0; // not a hex digit 
} 

void foo() 
{ 
    float y; 
    uint8_t *yPtr = (uint8_t *) &y; // a pointer the the 4 bytes of `y` 

    for (uint8_t i=0; i<sizeof(y); i++) { 
    *yptr = fromHex(B[ 6+2*i ]) << 4; 
    *yptr++ = fromHex(B[ 6+2*i + 1]); 
    } 
    ... 

它僅僅4個字節存儲到float,因爲Arduino的floats已經使用IEEE 754格式。無需指數,尾數等