天天看点

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++;

}
           
}//打印的时候不打印第一行,第一行全是字符
	
}