当我使用赛普拉斯的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 :(得分: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);