基于STM32 FatFs文件系统移植 部分问题解决办法

项目场景:

基于STM32 FatFs文件系统移植 ,部分的个人遇到问题解决办法,以野火开源代码为例。


问题一 描述:

例程中采用写入常量,我们如何向文件系统写入变量


解决方案:

采用sprintf函数,将变量格式化写入字符数组


问题二 描述:

需要多次向文件系统写入数据


原因分析:

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("
****** 即将进行文件写入测试... ******
");	

res_sd = f_open(&fnew, "0.txt",FA_CREATE_ALWAYS | FA_WRITE );

    if ( res_sd == FR_OK )
     {
            printf("》打开/创建FatFs读写测试文件.txt文件成功,向文件写入数据。
");

            /* 将指定存储区内容写入到文件内 */
            res_sd=f_write(&fnew,W,sizeof(W),&fnum);

            if(res_sd==FR_OK)
                {
                    printf("》文件写入成功,写入字节数据:%d
",fnum);
                    printf("》向文件写入的数据为:
%s
",W);
                }
    else
        {
            printf("!!文件写入失败:(%d)
",res_sd);
        }    

        /* 不再读写,关闭文件 */
            f_close(&fnew);
      }

解决方案:

在文件系统打开后,根据文件字节大小移动读/写指针,调用f_lseek函数

fres = f_lseek(&file, f_size(&file));

具体可查看FatFs网站:

在打开文件系后(f_open)之后调用

f_lseek,使其指针移动相应位置,指到文件尾端

第二次打开文件系统时

res_sd = f_open(&fnew, "0.txt", FA_WRITE );
	if ( res_sd == FR_OK )
		{
		printf("》打开/数据读取.txt文件成功,向文件写入数据。
");

		 /* 将指定存储区内容写入到文件内 */
		res_sd =f_lseek (&fnew,f_size(&fnew));
		res_sd=f_write(&fnew,W,sizeof(W),&fnum);

		 if(res_sd==FR_OK)
			{
			printf("》文件写入成功,写入字节数据:%d
",fnum);
			printf("》向文件写入的数据为:
%s
",W);
			}
经验分享 程序员 微信小程序 职场和发展