將外部采集到的數(shù)據(jù)或者將內(nèi)存的運算結(jié)果導(dǎo)出到SD中存儲有時很實用。前幾天有人懸賞500刀,征求利用FAT32文件系統(tǒng)的API向SD卡寫入實時數(shù)據(jù)的代碼,這兩天老夫?qū)⑵湔沓鰜砹。關(guān)鍵代碼如下:經(jīng)過本人測試只需將代碼移植過去稍作修改就能用。
思路是:將帶符號的整數(shù)(實際上浮點數(shù)也是可以的,只是函數(shù)需要修改一下)轉(zhuǎn)化為字符存儲在一個數(shù)組中,利用利用FAT32的讀寫文件API將數(shù)組內(nèi)容向SD卡寫入。代碼可以優(yōu)化。
//將整形數(shù)轉(zhuǎn)化為字符,
void Int32String_sign(char *p, int n)
{
int i,m, j;
//int ;
// char *p = r->str;//將結(jié)構(gòu)體成員所指向的空間賦值給p,也就是說p指向str
if ( n == 0 )
{
*p++ = ' ';
// *p++ = '0';
// *p++ = '.';
*p++ = '0';
*p++ = '0';
*p = 0;//字符數(shù)組P,最后一位賦值0
printf("輸入的值是0,直接返回!\n\r" );//
return; //如果n是0就結(jié)束函數(shù)
}
if ( n > 0 ){
*p++ = ' ';
printf("輸入的值是正數(shù),第一位加“ ”空格符號!\n\r" );//
}
else {
*p++ = '-';
n = -n;
printf("輸入的值是負數(shù),第一位加“-”符號!\n\r" );//
}
i = 0;
m=n;
while ( m >= 10 ) //只要m即n大于或等于10,
{
m/= 10;
i++ ;
printf("計算循環(huán)次數(shù)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++) //注意終止循環(huán)的條件,這部分代碼驗證用
// {
//
// printf("轉(zhuǎn)換結(jié)果:%c\n\r",p[j-i-2]);
// }
}
//文件測試函數(shù)
void FAT32_Test()
{
u8 j;
printf("|\t文件系統(tǒng)版本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);
}
/*創(chuàng)建文件,并寫入數(shù)據(jù)*/
printf("\r\n|\t正在創(chuàng)建新文件:例程.TXT\r\n");
res = f_open(&fdst,"0:/例程實時數(shù)據(jù).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));//重復(fù)寫入
// printf( "|\t文件創(chuàng)建成功,并寫入了新數(shù)據(jù):\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);//關(guān)閉文件
LCD_DispStr(10, 90,"Close File !", RED);
break;
}
// else if ( res == FR_EXIST )
// if ( res == FR_EXIST )
// {
// printf( "|\t文件已經(jīng)存在\r\n" );
// LCD_DispStr(10, 90,"File have been exsited !", RED);
//
// }
}
LCD_DispStr(10, 120,"READ File...", BLUE);
/*讀取文件內(nèi)容*/
printf("\r\n|\t正在讀取文件:例程.TXT\r\n");
res = f_open(&fdst, "0:/例程實時數(shù)據(jù).TXT", FA_OPEN_EXISTING | FA_READ);//只讀方式打開文件
// br = 1;
// for ( res=0; res<1024; res++ )//清除緩沖區(qū)
// 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從文件讀取到的內(nèi)容是:\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試驗結(jié)束。");
LCD_DispStr(10, 140,"File test OVER!", RED);
}
///////////////////---------GKXW-------2016年2月6日18:10:44--------------------------///////////////////////////////////////////////
|