2017-01-30 35 views
0

Я делаю проект регистратора данных. В моем регистраторе данных у меня есть 5 датчиков, таких как: температура, влажность, акселерометр, свет и барометр. Здесь я храню данные на SD-карте в двоичном формате. Я храню акселерометр @ 3200HZ и все остальные датчики в 1HZ.Чтение двоичных данных с различными типами данных

При записи я добавляю к каждому измерению датчика специальный символ типа $, &, чтобы идентифицировать данные во время чтения. Я не добавляю символ spl для данных акселерометра. Данные акселерометра - это огромные данные с 3200 Гц, поэтому я не добавляю символ spl, поскольку он потребляет некоторую память, а также делает задержку при записи, что приводит к пропуску некоторых образцов и может достигать только 2600 Гц для 3200 Гц.

Мой код Чтение данных выглядит следующим образом:

while((nr = fgetc(logFile)) != EOF) 
{ 
    if (nr == '$') 
    {  // read temp data if nr = $ 
     fread(&temp_read,sizeof(float),1,logFile); 
     pc.printf("\r\n %f",temp_read); 
    } 
    if (nr == '&') 
    { // read humidity data if nr = & 
     fread(&Humidity_read,sizeof(float),1,logFile); 
     pc.printf("\r\n %f",Humidity_read); 
    } 
    else 
    {   // if nr is not a spl character 
     data1 = nr;// send nr to a variable. 
     nr = fgetc(logFile);// read next byte and save it in nr 
     data2 = nr;// send nr to another variable 
     int16_t temp = (data1 | (data2 << 8));// club both bytes to form     int16_t data 
     pc.printf("\r\n %i",temp);// print the one axis 
    } 
} 

К сожалению, эта программа дает неверные данные. Существует огромная разница. Есть ли другой способ решить эту проблему. Где я делаю ошибки. Заранее спасибо.

+3

Вы знаете, что эти * специальные символы * не очень специальный представлен в двоичном виде? Если вы хотите читать двоичные данные, сначала прочитайте текстовые функции, такие как 'fgetc'. Затем подумайте о том, как правильно разграничить ваши данные. Подсказка: фиксированная ширина/байтовая начинка/текстовое кодирование. –

+2

Мой первый вопрос: уверены ли вы, что SPI правильно читает и записывает SD-карту? Вы пробовали очень низкую скорость чтения и записи фиктивных данных, чтобы убедиться, что даже это работает? – DiBosco

+1

Прежде всего: пожалуйста, укажите свой код. –

ответ

2

Возможно, вы потеете мелкие вещи своими попытками последовательно захватить высокоскоростные образцы, изменив формат данных. Проблема почти наверняка связана с латентностью блокировки на SD-карте (дополнительное время, затраченное на запись при пересечении флэш-страницы или границы сектора).

Вы, возможно, потребуется принять ряд подходов в сочетании:

  • Использование ОСРВ с выборки, выполняемой в высокой первоочередной задачи и протоколирования отложенным на приоритетной задачи низкой
  • Отправить образцы для задание ведения журнала в очереди достаточной длины для покрытия количества выборок, полученных во время максимальной задержки SD.
  • Тщательно выберите свою SD-карту; особенно если вы используете интерфейс SPI, а не SDIO. Я нашел карты с устойчивой скоростью записи от 32 кбайт до 800 тыс. Байт в секунду и блокировку латентности, превышающую 400 мс.

См How can I use an SD card for logging 16-bit data at 48 ksamples/s?

+1

Очень вдумчивый, целостный ответ. –