项目场景:
基于STM32 FatFs文件系统移植 ,部分的个人遇到问题解决办法,以野火开源代码为例。
问题一 描述:
例程中采用写入常量,我们如何向文件系统写入变量
解决方案:
采用sprintf函数,将变量格式化写入字符数组
C语言sprintf()函数:将格式化的数据写入字符串_C语言中文网 |
问题二 描述:
需要多次向文件系统写入数据
原因分析:
FATFS fs; /* FatFs文件系统对象 */
FIL fnew; /* 文件对象 */
FRESULT res_sd; /* 文件操作结果 */
UINT fnum; /* 文件成功读写数量 */
BYTE ReadBuffer[1024]={0}; /* 读缓冲区 */
BYTE WriteBuffer[] ="W"; /* 写缓冲区*/
/* 注册一个工作区域 */
res_sd = f_mount(&fs,"0:",1);
/*j 打开文件,如果文件不存在则创建它 */
printf("\r\n****** 即将进行文件写入测试... ******\r\n");
res_sd = f_open(&fnew, "0.txt",FA_CREATE_ALWAYS | FA_WRITE );
if ( res_sd == FR_OK )
{
printf("》打开/创建FatFs读写测试文件.txt文件成功,向文件写入数据。\r\n");
/* 将指定存储区内容写入到文件内 */
res_sd=f_write(&fnew,W,sizeof(W),&fnum);
if(res_sd==FR_OK)
{
printf("》文件写入成功,写入字节数据:%d\n",fnum);
printf("》向文件写入的数据为:\r\n%s\r\n",W);
}
else
{
printf("!!文件写入失败:(%d)\n",res_sd);
}
/* 不再读写,关闭文件 */
f_close(&fnew);
}
解决方案:
在文件系统打开后,根据文件字节大小移动读/写指针,调用f_lseek函数
fres = f_lseek(&file, f_size(&file));
具体可查看FatFs网站:FatFs - f_lseek (elm-chan.org)http://elm-chan.org/fsw/ff/doc/lseek.html
在打开文件系后(f_open)之后调用
f_lseek,使其指针移动相应位置,指到文件尾端
第二次打开文件系统时
res_sd = f_open(&fnew, "0.txt", FA_WRITE );
if ( res_sd == FR_OK )
{
printf("》打开/数据读取.txt文件成功,向文件写入数据。\r\n");
/* 将指定存储区内容写入到文件内 */
res_sd =f_lseek (&fnew,f_size(&fnew));
res_sd=f_write(&fnew,W,sizeof(W),&fnum);
if(res_sd==FR_OK)
{
printf("》文件写入成功,写入字节数据:%d\n",fnum);
printf("》向文件写入的数据为:\r\n%s\r\n",W);
}