OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3154|回复: 7

关于FATFS文件连续读写出现的问题

[复制链接]

5

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2019-9-25
在线时间
65 小时
发表于 2020-4-21 22:49:24 | 显示全部楼层 |阅读模式
20金钱
想问一下各位大佬,本人使用在stm32f103上移植了fatfs文件系统读写sd卡的内容,想要存储一些内容保存为书签文件(自定义的文件,文件名为bookmarkx,x为1~10)在sd卡中,规则是书签文件只能有10个,新的书签文件会替代旧的书签文件。自定义了一个函数u8 s_files(u8*path),功能是先利用另外定义两个的函数查看已存储书签的次数cnt1和该sd卡根目录下已有的书签数目cnt2(这两个函数也都用到了fatffs的读写操作,但分别独立封装),选择是新建还是替换书签文件后,在指定路径存储内容,保存为一个文件,然后显示另一个路径的文件。代码如下
u8 s_files(u8*path)
{
    FIL fil;
    char buffer[20*MAXSIZE]="";//要存储的内容
    FRESULT res;
    DIR dir;
    FILINFO*finfo=0;
    u8*fn=0;
    u8*pathp=0;
    u8 va;
    int i=0;
    u32 num2=6;//要存储的数据
    u32 num1=5;//要存储的数据
    finfo =(FILINFO*)mymalloc(SRAMIN,sizeof(FILINFO));
    finfo->lfsize=_MAX_LFN*2+1; //511         
    finfo->lfname= mymalloc(SRAMIN,finfo->lfsize);
    pathp=mymalloc(SRAMIN,100);
    pathp[0]=0;
    mymemset(pathp,0,100);
    strcat((char*)pathp,(const char*)path);
    strcpy(buffer,(const char*)path);
    cnt1=times_Read("0:/num.txt");//读取num.txt的数据
    cnt2=scan_Bookmark("0:");//查看已有书签的个数
    cnt3=strlen((const char*)buffer);//计算要存入内容的长度
    path_Change(cnt1,cnt2);//选择是新建书签文件还是修改已有书签文件
    res=f_opendir(&dir,"0:");
    if(!res)
    {
        res=f_open(&fil,(const TCHAR*)path_c,FA_READ|FA_WRITE|FA_CREATE_ALWAYS);
        res = f_write(&fil,&num1,sizeof(num1),&bw);
        res = f_write(&fil,&num2,sizeof(num2),&bw);
        if(!res)
        {
            do
            {
                res = f_write(&fil,buffer,cnt3,&bw);
                if(res)
                    break;
            }
            while (bw <cnt3);
        }        
    }
    f_close(&fil);
    if(res==FR_OK)
            times_Write("0:/num.txt");//写入成功后,创建书签的次数加1
/*显示某一个路径下面的文件*/

  res=f_opendir(&dir,(const TCHAR*)pathp);
    if(res==0)
    {
      while(1)
        {
          va=dir.index;
      res=f_readdir(&dir,finfo);
      fn=(u8*)(*finfo->lfname?finfo->lfname:finfo->fname);        
          if(!finfo->fname[0]||res!=FR_OK) break;
            if(finfo->fattrib==AM_DIR)
            {
             Show_Str(60,32+42*i,500,42,fn,32,0);
             i++;
            }
        }
    }   
    f_closedir(&dir);
    myfree(SRAMIN,finfo->lfname);
    myfree(SRAMIN,finfo);
    myfree(SRAMIN,pathp);
    return i;
}
在主函数调用这个函数后,无法显示某一路径下的文件,而且屏幕上出现的都是乱码,但书签可以正常创建。想问问各位大佬是什么原因?


最佳答案

查看完整内容[请看2#楼]

fil和dir也改用内存申请试试
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-4-21 22:49:25 | 显示全部楼层
fil和dir也改用内存申请试试
回复

使用道具 举报

5

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2019-9-25
在线时间
65 小时
 楼主| 发表于 2020-4-21 22:49:54 | 显示全部楼层
原子哥求助!
回复

使用道具 举报

5

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2019-9-25
在线时间
65 小时
 楼主| 发表于 2020-4-21 22:50:39 | 显示全部楼层
有没有大佬能解惑一下,顶
回复

使用道具 举报

5

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2019-9-25
在线时间
65 小时
 楼主| 发表于 2020-4-21 23:01:29 | 显示全部楼层
如果把写入一个书签文件的部分独立出来,两个函数都能正常使用,屏幕显示也正常,请问是为什么?不能在两个函数里面打开两个目录吗?可是我第一次调用后就把第一个目录关闭了
回复

使用道具 举报

5

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2019-9-25
在线时间
65 小时
 楼主| 发表于 2020-4-22 10:33:22 来自手机 | 显示全部楼层
有人能解答一下吗?
回复

使用道具 举报

5

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2019-9-25
在线时间
65 小时
 楼主| 发表于 2020-4-22 13:04:23 | 显示全部楼层
用串口助手调试了一下,没把写入数据分离出来之前显示的图1 1.jpg ,分离以后分别执行是图2 2.jpg ,这是什么原因呢?
回复

使用道具 举报

5

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2019-9-25
在线时间
65 小时
 楼主| 发表于 2020-4-23 14:18:24 | 显示全部楼层
正点原子 发表于 2020-4-23 01:39
fil和dir也改用内存申请试试

成功了啊!谢谢原子哥,我把获其他函数里的dir和fil也改成申请内存。想问问拿定义DIR dir为例,直接这么定义和定义Dir *dir指针然后分配内存有什么区别吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 02:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表