2017-01-30 10 views
0

데이터 로거 프로젝트를 만들고 있습니다. 데이터 로거에는 온도, 습도, 가속도계, 조명 및 기압계와 같은 5 가지 센서가 있습니다. 여기에서 데이터를 이진 형식의 SD 카드에 저장합니다. 나는 가속도계 @ 3200HZ와 모든 다른 센서들을 1HZ에 저장하고있다.다른 데이터 형식의 이진 데이터 읽기

글을 쓰는 동안 나는 각 센서 측정치에 $, &과 같은 특수 문자를 추가하여 읽는 동안 데이터를 식별합니다. 나는 가속도계 데이터에 어떤 스플래트 문자도 추가하지 않을 것이다. 가속도계 데이터는 3200HZ의 대용량 데이터이므로 일부 메모리를 소비하면서 스플라인 문자를 추가하지 않고 일부 샘플을 놓치고 3200HZ의 경우에만 2600HZ를 얻을 수 있습니다. 잘못된 데이터를 제공

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 카드의 블록 대기 시간과 관련이 있습니다 (플래시 페이지 또는 섹터 경계를 초과 할 때 쓰는 데 추가 시간이 소요됨).

당신은 조합 접근 방법을해야 할 수도 있습니다

  • 사용 RTOS가 우선 순위가 높은 작업을 수행 샘플링과 낮은 우선 순위의 태스크
  • 로 연기 로깅에 샘플을 보내기로 최대 SD 대기 시간 동안 수집 된 샘플 수를 포괄 할 수있는 충분한 길이의 대기열에있는 로깅 작업.
  • SD 카드를 신중하게 선택하십시오. 특히 SDIO 인터페이스 대신 SPI를 사용하는 경우 특히 그렇습니다. 필자는 초당 32k에서 800k 바이트 사이의 쓰기 속도를 유지하고 400ms를 초과하는 대기 시간을 차단하는 카드를 발견했습니다.

당신은 알고 How can I use an SD card for logging 16-bit data at 48 ksamples/s?

+1

아주 사려 깊고 전체 론적 인 대답입니다. –