2017-06-15 47 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格式。无需指数,尾数等