Я делаю проект регистратора данных. В моем регистраторе данных у меня есть 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
}
}
К сожалению, эта программа дает неверные данные. Есть огромная разница. Есть ли другой способ решить эту проблему. Где я делаю ошибки. Заранее спасибо.
Вы, вероятно, потеете мелочами, пытаясь последовательно фиксировать высокоскоростные сэмплы, изменяя формат данных. Проблема почти наверняка связана с задержкой блоков на SD-карте (дополнительное время, затрачиваемое на запись при пересечении флеш-страницы или границы сектора).
Возможно, вам придется использовать несколько подходов в сочетании:
Увидеть Как я могу использовать SD-карту для записи 16-битных данных со скоростью 48 кбит / с?
Других решений пока нет …