天天看點

stm32 cd 卡操作 csv讀寫

stm32 讀寫csv

sd卡驅動和檔案系統

FatFs檔案

http://elm-chan.org/fsw/ff/00index_e.html

api 說明url

stm32 cd 卡操作 csv讀寫

f_open 的操作 很重要,讀寫之前都 有對權限的操作 ,

這個過程 有問題非常麻煩

int32 putString2Csv(char str[], char filename[], int mode)

{

f_open(&fil,filename,FA_OPEN_ALWAYS|FA_WRITE );
_mode = mode;
switch (_mode)
{
case ECWM_ONELINE:
{
		
		  f_lseek(&fil,fil.fsize);

      f_puts(str, &fil);   // str 就是有寫入的資料
		    f_puts(",", &fil);// ,是單元格的分格了,
		
		//字元串
   
}break;
case ECWM_OTHERLINE:
{
		  f_lseek(&fil,FileSize);
		  f_lseek(&fil,sizeof(fil));
    f_puts("\n", &fil);   // 寫入回車,就是換一行,在csv 檔案就是第二行
}break;
default:break;
}
if (f_close(&fil) != 0)
{
   // ERR_RETURN("fclose called error", -1);
}
return 1;
           

}

main.c

這種打開寫是因為我有重寫進去,FA_CREATE_ALWAYS

enum eCsvWriteMode

ECWM_ONELINE = 1,

ECWM_OTHERLINE, //換行

};

f_open(&fil,filenames,FA_CREATE_ALWAYS | FA_WRITE );

putString2Csv(strtemp1,filenames,ECWM_ONELINE);

putString2Csv(strtemp1,filenames,ECWM_OTHERLINE); //換行

讀,

讀取時有建一個二維資料,如果stm32 的記憶體少了,就會出現讀不出來,

如果記憶體少,建議修大點動态記憶體

stm32 cd 卡操作 csv讀寫

char line[1024];

int ** data;

int row, col;

row = 1;

col = 6;

// 如果資料是浮點,那麼這個地方的記憶體申請修成浮點數

data =(int *) malloc(row * sizeof(int));

for (int i = 0; i < row; ++i) {

data[i] =(int *) malloc(col * sizeof(int));

}//動态申請二維數組

get_two_dimension(line, data, filenames);

print_two_dimension(data, row, col);
           
while (f_gets(line,1024,&fil))//逐行讀取
{
    int j = 0;
    char * tok;
		 int32 value;
      printf("dddd %s\t", line);					
    for (tok = strtok(line, ","); tok && *tok; j++, tok = strtok(NULL, ",\n")) 
	  	{
				
				  sscanf(tok,"%ld",&value);
				
        data[i][j] = value;                                          //轉換成浮點數
     }                                                                  //字元串拆分操作
    i++;

}
           
}//列印的時候不列印第一行,第一行全是字元
	
}