将外部采集到的数据或者将内存的运算结果导出到SD中存储有时很实用。前几天有人悬赏500刀,征求利用FAT32文件系统的API向SD卡写入实时数据的代码,这两天老夫将其整理出来了。关键代码如下:经过本人测试只需将代码移植过去稍作修改就能用。
思路是:将带符号的整数(实际上浮点数也是可以的,只是函数需要修改一下)转化为字符存储在一个数组中,利用利用FAT32的读写文件API将数组内容向SD卡写入。代码可以优化。
//将整形数转化为字符,
void Int32String_sign(char *p, int n)
{
int i,m, j;
//int ;
// char *p = r->str;//将结构体成员所指向的空间赋值给p,也就是说p指向str
if ( n == 0 )
{
*p++ = ' ';
// *p++ = '0';
// *p++ = '.';
*p++ = '0';
*p++ = '0';
*p = 0;//字符数组P,最后一位赋值0
printf("输入的值是0,直接返回!\n\r" );//
return; //如果n是0就结束函数
}
if ( n > 0 ){
*p++ = ' ';
printf("输入的值是正数,第一位加“ ”空格符号!\n\r" );//
}
else {
*p++ = '-';
n = -n;
printf("输入的值是负数,第一位加“-”符号!\n\r" );//
}
i = 0;
m=n;
while ( m >= 10 ) //只要m即n大于或等于10,
{
m/= 10;
i++ ;
printf("计算循环次数i:%d\n\r",i );//
}
if(i>=8)
{
printf("输入值过大,直接退出程序!\n\r" );//
return;
}
switch ( i ) {
case 9:
*p++ = '0'+n/1000000000;
n %= 1000000000;
case 8:
*p++ = '0'+n/100000000;
n %= 100000000;
case 7:
*p++ = '0'+n/10000000;
n %= 10000000;
case 6:
*p++ = '0'+n/1000000;
n %= 1000000;
case 5:
*p++ = '0'+n/100000;
n %= 100000;
case 4:
*p++ = '0'+n/10000;
n %= 10000;
case 3:
*p++ = '0'+n/1000;
n %= 1000;
*p++ = '0'+n/100;
n %= 100; //n/=10;
// printf("n 对100取余 :%d\n\r",n);//55
*p++ = '0'+n/10;
// n/=10;
n %= 10;
// printf("n 对10取余:%d\n\r",n );//5
*p++ = '0'+n;
*p = 0;
break;
case 2:
*p++ = '0'+n/100;
n %= 100; //n/=10;
// printf("n 对100取余 :%d\n\r",n);//55
*p++ = '0'+n/10;
// n/=10;
n %= 10;
// printf("n 对10取余:%d\n\r",n );//5
*p++ = '0'+n;
*p = 0;
break;
case 1:
*p++ = '0'+n/10;
// n/=10;
n %= 10;
// printf("n 对10取余:%d\n\r",n );//5
*p++ = '0'+n;
*p = 0;
break;
case 0:
*p++ = '0'+n; break;
}
// for( j=0;j<i+2;j++) //注意终止循环的条件,这部分代码验证用
// {
//
// printf("转换结果:%c\n\r",p[j-i-2]);
// }
}
//文件测试函数
void FAT32_Test()
{
u8 j;
printf("|\t文件系统版本R0.1b\r\n");
printf ( "|\t开始初始化......\r\n" );
/*挂载存储器*/
res = f_mount(&fs,"0:",1);
if(res == FR_OK)
{
printf("|\t挂载成功\r\n");
LCD_DispStr(10, 40, "Succeed Load FAT32 !", RED);
}
else {
printf("|\t挂载错误,错误代码%d\r\n",res);
LCD_DispStr(10, 40,"Failar Load FAT32 !", RED);
}
/*创建文件,并写入数据*/
printf("\r\n|\t正在创建新文件:例程.TXT\r\n");
res = f_open(&fdst,"0:/例程实时数据.TXT",FA_OPEN_ALWAYS | FA_WRITE);
//打开文件,如果不存在就新建
while( (res == FR_OK )||(res ==FR_EXIST))
{
DATA++;delay_ms(100);
Int32String_sign(str, DATA);
res = f_write(&fdst, str, sizeof(DATA), &bw);
f_lseek(&fdst,f_size(&fdst));//重复写入
// printf( "|\t文件创建成功,并写入了新数据:\r\n" );
// printf( "|\t%s \r\n ", &DATA);
LCD_DispStr(10, 70,"Succeed Create .TXT !", RED);
if(DATA==100)
{
DATA=0;
f_sync(&fdst);// f_close(&fdst);//关闭文件
LCD_DispStr(10, 90,"Close File !", RED);
break;
}
// else if ( res == FR_EXIST )
// if ( res == FR_EXIST )
// {
// printf( "|\t文件已经存在\r\n" );
// LCD_DispStr(10, 90,"File have been exsited !", RED);
//
// }
}
LCD_DispStr(10, 120,"READ File...", BLUE);
/*读取文件内容*/
printf("\r\n|\t正在读取文件:例程.TXT\r\n");
res = f_open(&fdst, "0:/例程实时数据.TXT", FA_OPEN_EXISTING | FA_READ);//只读方式打开文件
// br = 1;
// for ( res=0; res<1024; res++ )//清除缓冲区
// buffer[res]=0;
// res = f_read( &fdst, buffer, sizeof(buffer), &br );//读取文件
if( (res == FR_OK )||(res ==FR_EXIST))
{
LCD_DispStr(10, 180,"READ..data:", RED);
for( j=0;j<100;j++){
res = f_read( &fdst, buffer, sizeof(buffer), &br );//读取文件
printf("|\t从文件读取到的内容是:\r\n|\t%s", buffer);
delay_ms(100);
LCD_DispChar(120,180,buffer[j],BLUE);
// LCD_Number(120,180,buffer[j],BLUE);
}
}
else {
printf("|\t读取文件失败,错误代码是:%d",res);
LCD_DispStr(10, 180,"READ error!", BLUE);
}
f_close(&fdst);
printf("\r\n|\t试验结束。");
LCD_DispStr(10, 140,"File test OVER!", RED);
}
///////////////////---------GKXW-------2016年2月6日18:10:44--------------------------///////////////////////////////////////////////
|