stm32 读写csv
sd卡驱动和文件系统
FatFs文件
http://elm-chan.org/fsw/ff/00index_e.html
api 说明url
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);
void get_two_dimension(char* line, int** data, char* filename) //读取单元格数据 主要读取数据并处理数据,print_two_dimension是数据输出,
{
char* tmp;
int i;
i=0;
fr=f_open(&fil, filename, FA_OPEN_ALWAYS|FA_READ);
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++;
}
f_close(&fil); //文件打开后要进行关闭操作
}
void print_two_dimension(int ** data, int row, int col) //读取单元格数据 输出数据
{
int i, j;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++)
{
printf(“cc %d\t”, data[i][j]);
//data[i][j];
}
}//打印的时候不打印第一行,第一行全是字符
}
初次接触 sd卡读写