2016-10-28 182 views
1

當我使用賽普拉斯的SDCard Library寫入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[]string可能會將前者轉換爲c字符串,後者以null char結尾。意思是你最重要的字節(0x00)會提前終止字符串。 257以下的任何uint16都會導致在最重要的位置出現空字符。

e.g:

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 

嘗試明確您鑄造的char []到的std :: string,並指定它的大小。例如:

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

我相信你是對的。我觀察到的與您所描述的相符。你如何解決這個問題? 我也許可以添加一個比較函數,比如** for **循環說「如果一個值小於257並且大於-1」,那麼在我的後處理中,我會檢查每個上面的二進制部分它有33in。 當然,這將意味着每個值與00100001在上面的部分將被處罰:/ –

+0

好吧,如上所述,首先嚐試顯式強制轉換爲字符串大小的std :: string。如果這不起作用,請查看庫是否接受指向字符串的指針,除此之外,您可能必須自己修改庫以支持空字符。 – Enfyve

+0

@AndreasHD很好,在轉換爲uint16_t之後,您不必擔心數字<0,但是如果您想要將實際的二進制文件寫入SD卡上的文件,則需要保留0x00字節,所以更改值可能不是你想要的。 – Enfyve

相關問題