CVS文件导入到STM32:
CVS文件是EXCEL文件保存为以逗号分隔的记录文件,可以方便STM32识别转换。
但是CVS文件如果太大,STM32 RAM不够缓冲整个文件怎么办?
使用FATS文件系统中的f_gets 读取一行字符串,一行一行进行识别转换至文件结尾。
/************************
字符串转整形数
*************************/
char *CvsStrToInt(char *str,u16 *val)
{
u8 j=0;
// char temp;
u16 num=0;
do
{
if(*str >='0' && *str <='9')//为了保证是数字字符串
num = (num*10) + (*str-'0');
if(j++ > 4)break;
str++;
}while(*str != ',');
*val = num;
str++;
return str;
}
/************************
字符串转整形数,逗号结束
*************************/
char *CvsStrToByte(char *str,u8 *val)
{
u8 j=0;
u8 num=0;
do
{
if(*str >='0' && *str <='9')//为了保证是数字字符串
num = (num*10) + (*str-'0');
if(j++ > 3)break;
str++;
}while(*str != ',');
*val = num;
str++;
return str;
}
/************************
CVS 提取字符串
*************************/
char *CvsGetStr(char *str , char *restr)
{
u8 j=0;
do
{
*restr++ = *str;
if(j++>41)break;
str++;
}while(*str != ',');
str++;
return str;
}
/******* 整形数转成8位带0字符 ********/
void IntToStr(u32 num,char *str)
{
u8 i;
u32 temp32 = num;
str += 7;
for(i=0;i<8;i++)
{
*str = (temp32 % 10) + 0x30;
str--;
temp32 /= 10;
}
}
void ReadLampsCSV(char *str)
{
u8 Type,Default,fa[5];
char Post[21];
char *sp=str;
u16 num,EPS_add,Lamp_add;
sp = CvsStrToInt(sp,&num);
sp = CvsStrToInt(sp,&EPS_add);
sp = CvsGetStr(sp,Post);
sp = CvsStrToInt(sp,&Lamp_add);
sp = CvsStrToByte(sp,&Type);
sp = CvsStrToByte(sp,&Default);
sp = CvsStrToByte(sp,&fa[0]);
sp = CvsStrToByte(sp,&fa[1]);
sp = CvsStrToByte(sp,&fa[2]);
sp = CvsStrToByte(sp,&fa[3]);
sp = CvsStrToByte(sp,&fa[4]);
}
void ReadLampsFile(void)
{
u32 i=0;
u32 fsize;
char str[50];
f_res = f_open(&file, "INI.csv",FA_READ);
printf_fatfs_error(f_res);
if(f_res == FR_OK )
{
printf("打开%s文件成功。\r\n","INI.csv");
TJC_Send_Str("t2.txt=\"打开INI.csv文件成功\"");
fsize = mf_size();
printf("打开文件大小:%d。\r\n",fsize);
f_gets((char *)ReadBuffer, 1000, &file); //先读一行,这个是表头,不需要识别
TJC_Send_Str("t2.txt=\"开始导入。。。。\"");
do
{
f_gets((char *)ReadBuffer, 1000, &file); //读取一行
ReadLampsCSV((char *)ReadBuffer); //识别一行的数据
sprintf(str,"j0.val=%d",i++/(80));
TJC_Send_Str(str);
}while(!f_eof(&file)); //文件结束
TJC_Send_Str("j0.val=0");
TJC_Send_Str("t2.txt=\"导入完成\"");
f_close(&file);
NORFLASH_Write_L((u8 *)&EpsData,0,sizeof(EpsData));
}
else
{
printf_fatfs_error(f_res);
printf("!!打开/创建文件失败。\r\n");
TJC_Send_Str("t2.txt=\"打开INI.csv文件失败\"");
}
}