2016-10-28 2 views
1

Когда я пишу на свою SD-карту, используя библиотеку SDCard от Cypress, у меня есть некоторые проблемы. Потому что мне нужно все ускорить, используя sprintf(), и подобное невозможно.Странное поведение при переключении

Библиотека позволяет мне записывать на 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) заканчивает строку раньше. Любой uint16 до 257 приведет к нулевому символу в наиболее значительном месте.

например:

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 

Попробуйте явно Отдавая свой символ [] к станд :: строки и указав размер его. ex:

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

Я считаю, что вы правы. То, что я наблюдаю, соответствует тому, что вы описываете. Как вы предлагаете мне эту проблему? Я мог бы добавить сравнительную функцию, например ** для ** цикла, говорящего «если значение меньше 257 и больше -1. ​​Добавить 33» Затем в моей постобработке я делаю чек для каждой верхней двоичной части, в нем. Конечно, это означало бы, что каждое значение с 00100001 в верхней части будет иметь аффект:/ –

+0

Ну, как упоминалось выше, сначала попробуйте с явным приведением в std :: string с размером строки. Если это не работает, посмотрите, принимает ли библиотека указатель на строку, кроме того, вам может потребоваться изменить библиотеку самостоятельно, чтобы поддерживать нулевые символы. – Enfyve

+0

@AndreasHD ну, после того, как вы нажмете на uint16_t, вам не нужно беспокоиться о числах <0, но если вы пытаетесь записать фактический двоичный файл в файл на SD-карте, вам нужно сохранить 0x00 байт , поэтому изменение значений может быть не таким, каким вы хотите. – Enfyve

Смежные вопросы