stm32 讀寫csv
sd卡驅動和檔案系統
FatFs檔案
http://elm-chan.org/fsw/ff/00index_e.html
api 說明url
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iMyITN5I2MzIWNiZjYhNGOxYzX1MDNzMTMxEzLcFTMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL0M3Lc9CX6MHc0RHaiojIsJye.png)
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 的記憶體少了,就會出現讀不出來,
如果記憶體少,建議修大點動态記憶體
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++;
}
}//列印的時候不列印第一行,第一行全是字元
}