2017-06-15 47 views
0

文字列を1つの浮動小数点数に変換しようとしています。文字列の長さは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タグが含まれています。その仕様は、使用されるマリッサ、指数、およびバイアスのレイアウトの定義において明確である。あなたは長いビット単位の操作を行う必要がありますが、それを行うことができます。仕様に従ってください。 – TomServo

+0

Arduinoに接続された力センサー用のADCを備えたアンプがあります。取得する入力データは1バイトで、それを1つのStringに入れます。 – LostInTechnology

答えて

0

これらの限定RAMのArduinosでは、実際にはStringを使用しないでください。奇妙なエラーが発生し、ランダムな時間が経過するとハングすることがあります(詳細はhere)。文字配列を使用して、センサーから受け取った文字を保持するだけです。ここでStringまたはchar[]のいずれかで動作しますいくつかのコードです:

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]); 
    } 
    ... 

ArduinoのfloatsはすでにIEEE 754形式を使用するので、それは単に、floatに4つのバイトを格納します。指数、仮数などをデコードする必要はありません。

関連する問題