2016-10-28 3 views
1

サイプレスのSDCardライブラリを使用してSDカードに書き込むと、いくつかの課題があります。私はすべてをスピードアップする必要があるので、sprintf()などを使用することはできません。シフト時の奇妙な動作

ライブラリでは、ucharsまたは文字列のいずれかでSDカードに書き込むことができます。残念ながら私の値はすべてint16_tです。ここに問題が発生する場所があります。

int16_t ax = -15000; 
     ay = -10000; 
     az = -32760; 
     gx = 32760;  
     gy = 25000; 
     gz = 10;  
     mx = -10; 
     my = 20; 
     mz = 0; 

// Then I put it into an array 

char suma[] = { 
    ((uint16_t) ax) & 0xff, 
    ((uint16_t) ax) >> 8, 
    ((uint16_t) ay) & 0xff, 
    ((uint16_t) ay) >> 8, 
    ((uint16_t) az) & 0xff, 
    ((uint16_t) az) >> 8, 

    ((uint16_t) gx) & 0xff, 
    ((uint16_t) gx) >> 8, 
    ((uint16_t) gy) & 0xff, 
    ((uint16_t) gy) >> 8, 
    ((uint16_t) gz) & 0xff, 
    ((uint16_t) gz) >> 8, 

    ((uint16_t) mx) & 0xff, 
    ((uint16_t) mx) >> 8, 
    ((uint16_t) my) & 0xff, 
    ((uint16_t) my) >> 8, 
    ((uint16_t) mz) & 0xff, 
    ((uint16_t) mz) >> 8, 
    0 
}; 

データを取得するときに何か問題があります。データはgzまで正常です。それは10良いことを示していますが、残りはまったくなくなっています。

を10から257に変更すると問題は解決され、-10は正常です。これは、負でない値を右にシフトするとエラーが発生することを意味します。

アップしていますか?洞察力があることを願っています:)

+0

CまたはC++と仮定しますか? – Enfyve

+0

申し訳ありません、そのC++ –

+0

調整後にgz出力はどうなりますか? – Enfyve

答えて

1

int16_tをuint16に変換してからcharに変換すると、null char(\ 0)がライブラリに送信される可能性が高くなります。

char[]またはしか受け付けないライブラリは、おそらく前者をC文字列にキャストします。これらの文字列は、末尾がnull charです。あなたの最も重要なバイト(0x00)が文字列を早く終了させることを意味します。 257より下のuint16は、最も重要な箇所にヌル文字をもたらします。

例えば:

0000 0000 = [0, 0] = [0x00, 0x00] // 2 null chars, only the first will get across 
0001 0000 = [1, 0] = [0x01, 0x00] // null char 
            // ... 
1111 0000 = [256, 0] = [0xff, 0x00] // null char 
1111 0001 = [256, 1] = [0xff, 0x01] // not null char 

てみ明示的にはstd ::文字列にあなたのchar []をキャストし、それのサイズを指定します。例:

std::string s("ab\0c", 4); 
+0

私はあなたが正しいと信じています。私が観察するのは、あなたが描写したものと一致します。私はこの問題をどのように管理することを提案しますか? おそらく** for **ループのように、 "値が257より小さく、-1より大きい場合"というような比較関数を追加することができます。その後、私の後処理では、 33インチあります。 これは、上の部分に00100001のすべての値がアタックされることを意味します:/ –

+0

まあ、上記のように、文字列のサイズをstd :: stringに明示的にキャストしてみてください。それでもうまくいかない場合は、ライブラリが文字列へのポインタを受け入れるかどうかを確認してください。それ以外の場合は、ヌル文字をサポートするためにライブラリを自分で変更する必要があります。 – Enfyve

+0

@AndreasHDまあ、uint16_tにキャストした後は、<0という数字について心配する必要はありませんが、実際のバイナリをSDカードのファイルに書き込もうとしている場合は、0x00バイト値を変更することは、あなたが望むものではないかもしれません。 – Enfyve