Чтение двоичных данных с различными типами данных

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

Во время написания я добавляю специальный символ, такой как $,& для каждого датчика измерения, чтобы идентифицировать данные во время чтения. Я не добавляю символов 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
}
}

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

0

Решение

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

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

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

Увидеть Как я могу использовать SD-карту для записи 16-битных данных со скоростью 48 кбит / с?

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]