OpenEdv-开源电子网

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

求助FatFs文件系统向SD卡写数据时文件重复的问题。

[复制链接]

2

主题

13

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-4-3
在线时间
5 小时
发表于 2018-4-3 15:57:41 | 显示全部楼层 |阅读模式
10金钱
有熟悉FatFs文件系统的朋友能否帮忙看下我的问题。
我是每隔一秒向SD卡.wav文件写入一个buf数据,wav文件名为时间,buf大小为u8 Buf[2048],如果文件存在,打开文件把数据写入尾部,如果文件不存在,新建文件,但是出现了个问题,就是有时会产生多个相同文件名的文件,这是写入的数据当然也就不对了。如图所示

代码如下:
u8 WriteFile(u8 *databuf,u32 bytesToWrite)
{
    FRESULT res;

    uint16_t bytesWritten;
    uint32_t addr;
          u8 ret= false;

    DIR dirs;
       
        res = f_mount(0,&fatfs);

  res = f_mkdir((XCHAR*)&gCurrentFile.dir_name[0]);
    if (res == FR_OK)
        {
                if(DEBUG_SD_STORE_UART_OUTPUT)
                    UART_UsrLog(" New Dir \n");
        }
        else if(res == FR_EXIST)
        {
                if(DEBUG_SD_STORE_UART_OUTPUT)
                    UART_UsrLog(" Dir Exist \n");
        }
        else
        {
                if(DEBUG_SD_STORE_UART_OUTPUT)
                    UART_UsrLog(" Mkdir err \n");
                f_mount(0, NULL);
          return(ret);
        }

        if ((res == FR_OK) || (res == FR_EXIST))
        {
                res = f_open(&file, (XCHAR*)&gCurrentFile.file_name[0],FA_OPEN_ALWAYS | FA_WRITE);
                if ((res == FR_OK) || (res == FR_EXIST))
                {
                        res = f_lseek(&file,file.fsize);
                        if(res != FR_OK)
                                {
                                        f_close(&file);       
                                        f_mount(0, NULL);
                                        ret =false;
                                        return(ret);                                       
                               }
                                res= f_write (&file, databuf, bytesToWrite, (void *)&bytesWritten);   
                                if((bytesWritten == 0) || (res != FR_OK))
                                {
                                        if(DEBUG_SD_STORE_UART_OUTPUT)
                                                UART_UsrLog("file write false \n");
                                        ret =false;
                                }
                                else
                                {
                                         ret = true;
                                }
                                /*close file and filesystem*/
                                f_close(&file);            
                }
                else
                {
                        ret = false;
                }
        }
        f_mount(0, NULL);
        return(ret);
  }


恳请高手指点一下,困扰我好几天了,我用的文件系统是 FatFs - FAT file system module  R0.07e
2.JPG

最佳答案

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

已经解决,具体解决可以研究下FatFs里用到的函数,这个说来话长,有兴趣的留言,我们再进一步讨论。
学无止境
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-4-3
在线时间
5 小时
 楼主| 发表于 2018-4-3 15:57:42 | 显示全部楼层
已经解决,具体解决可以研究下FatFs里用到的函数,这个说来话长,有兴趣的留言,我们再进一步讨论。
学无止境
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-4-3
在线时间
5 小时
 楼主| 发表于 2018-4-3 16:07:59 | 显示全部楼层
我的初衷是,按时间来定义文件名,如果文件不存在,新建文件并把数据写入文件中,如果文件存在,写入文件尾部。但是大家从我发的贴图上可以看见,有时文件已经存在,但是还新建了和已经存在的文件相同的文件,并写入一个buf,也就是2k数据。
我看了下文件系统中ff.c文件中的函数f_open()函数,已经里面用到的follow_path()函数,create_name()函数,但还是不懂为什么会出现这种情况,我是个新手,恳请高手帮我看看该如何解决。非常感谢
学无止境
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-4-3
在线时间
5 小时
 楼主| 发表于 2018-4-3 17:02:48 | 显示全部楼层
谁帮我解决了这个问题,我可以通过微信发100元红包。
学无止境
回复

使用道具 举报

21

主题

2208

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5136
金钱
5136
注册时间
2014-8-26
在线时间
1316 小时
发表于 2018-4-3 18:58:32 | 显示全部楼层
帮顶。
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-4-3 19:34:04 来自手机 | 显示全部楼层
是不是文件名太长没显示而已,文件名用字符串截取指定长度再打开,还有检查下open的参数,那个always经常制造麻烦
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164846
金钱
164846
注册时间
2010-12-1
在线时间
2098 小时
发表于 2018-4-4 00:25:34 | 显示全部楼层
1,DIR不要做局部变量。
2,不要在函数里面f mount,不要反复mkdir
3,你创建文件,只需要fopen即可创建。
4,可以参考我们开发板照相机实验,按按键就拍一个照片。也是存储不同文件名。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-4-3
在线时间
5 小时
 楼主| 发表于 2018-4-4 13:08:07 | 显示全部楼层
本帖最后由 david2018 于 2018-4-4 14:52 编辑
正点原子 发表于 2018-4-4 00:25
1,DIR不要做局部变量。
2,不要在函数里面f mount,不要反复mkdir
3,你创建文件,只需要fopen即可创建。 ...

你好,你们的例子哪里能找到?[我在公布的网盘里找到了例程,但是还不能解决我说的问题]
还有就是创建文件,我知道用f_open可以创建,而且这个函数是如果这个 文件名 的文件如果存在,即打开这个文件。现在的问题就出在,这个 文件名 的文件已经存在,不是打开,而且又创建了一个相同名称的文件,而且Windows中,如果同一目录下,不允许存在而且文件名相同,文件类型相同的文件。
你提示的1,2条我会调整下代码,但是我感觉我这个问题的本质是为什么f_open会出错?
学无止境
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-4-3
在线时间
5 小时
 楼主| 发表于 2018-4-4 15:24:33 | 显示全部楼层
孟亮 发表于 2018-4-3 19:34
是不是文件名太长没显示而已,文件名用字符串截取指定长度再打开,还有检查下open的参数,那个always经常制 ...

文件名倒不长,只有23个字符,open的参数你也看到了,就是f_open(&file, (XCHAR*)&filename[0],FA_OPEN_ALWAYS | FA_WRITE);
这个问题不是每次都出现,而是一天24小时内出现那么10几次,每10分钟左右产生一个文件,文件从0存储到2M大约需要10分钟,所以每小时产生6个文件的样子。一天存储130多个文件。但130个文件会出现10多次错误,这个频率太高了。我想解决但我不知道怎么解决这个问题啊
学无止境
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-4-3
在线时间
5 小时
 楼主| 发表于 2018-4-4 16:16:52 | 显示全部楼层
文件名是这样定义的:
        举例如下
        u16  wav_file_name[23];
        wav_file_name[0] = '0';
        wav_file_name[1] = ':';
        wav_file_name[2] = '/';
        wav_file_name[3] = '2';
        wav_file_name[4] = '0';
        wav_file_name[5] = '1';
        wav_file_name[6] = '8';
        wav_file_name[7] = '0';
        wav_file_name[8] = '3';
        wav_file_name[9] = '2';
        wav_file_name[10] = '6';
        wav_file_name[11] = '/';
        wav_file_name[12] = '0';
        wav_file_name[13] = '2';
        wav_file_name[14] = '4';
        wav_file_name[15] = '6';
        wav_file_name[16] = '1';
        wav_file_name[17] = '4';
        wav_file_name[18] = '.';
        wav_file_name[19] = 'w';
        wav_file_name[20] = 'a';
        wav_file_name[21] = 'v';
        wav_file_name[22] = 0;
学无止境
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164846
金钱
164846
注册时间
2010-12-1
在线时间
2098 小时
发表于 2018-4-5 01:28:00 | 显示全部楼层
david2018 发表于 2018-4-4 13:08
你好,你们的例子哪里能找到?[我在公布的网盘里找到了例程,但是还不能解决我说的问题]
还有就是创建文 ...

出错得看f_open的返回值来确定问题点。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-4-3
在线时间
5 小时
 楼主| 发表于 2018-4-7 08:30:45 | 显示全部楼层
正点原子 发表于 2018-4-5 01:28
出错得看f_open的返回值来确定问题点。

f_open返回值是FR_OK的,而且给新文件中都写入数据了。
我就很纳闷,为什么这个文件已经存在了,怎么不是打开,而是又创建一个同样的文件向里面写东西。
学无止境
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-4-3
在线时间
5 小时
 楼主| 发表于 2018-4-7 16:10:53 | 显示全部楼层
原子哥,我对fatfs很陌生,你能告诉我,f_open()函数里那段代码,或者里面嵌套的哪个函数判断如果参数*path给定的文件存在就打开,而不是创建新的。我看了一下f_open()函数,没有发现有枚举一下这个目录下的文件,如果有这个文件,就打开这个文件的代码段啊。

我是一个初学者,或许提的问题很弱,请不吝赐教。
学无止境
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164846
金钱
164846
注册时间
2010-12-1
在线时间
2098 小时
发表于 2018-4-8 02:08:25 | 显示全部楼层
david2018 发表于 2018-4-4 13:08
你好,你们的例子哪里能找到?[我在公布的网盘里找到了例程,但是还不能解决我说的问题]
还有就是创建文 ...

照相机实验
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
146
金钱
146
注册时间
2018-3-11
在线时间
20 小时
发表于 2018-5-23 17:49:40 | 显示全部楼层
请问你是怎么实现数据存储至SD的?可以分享代码吗?谢谢
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2019-9-1
在线时间
8 小时
发表于 2019-9-1 09:59:47 | 显示全部楼层
最近也遇到了这个问题,请问 你是如何解决的
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2019-10-31
在线时间
0 小时
发表于 2019-10-31 20:11:34 来自手机 | 显示全部楼层
请问,如何解决的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-4-20 00:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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