OpenEdv-开源电子网

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

FATFS读取数据问题

[复制链接]

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
发表于 2013-6-27 10:21:19 | 显示全部楼层 |阅读模式
f_mount(0, &fs);     //将文件系统设置到0区 
             
if (f_opendir(&dirs, (const TCHAR*)"0:/Song") == FR_OK) //读取该磁盘的根目录   
{

    while (f_readdir(&dirs, &finfo) == FR_OK)   //循环依次读取文件名
    {

        if(!finfo.fname[0]) break;         //如果是文件名为空表示到目录的末尾。退出  

USART_OUT(USART1,"\r\n文件名是:\n   %s\n",finfo.lfname);         //输出文件名---这里读出文件名是正常的

fn = finfo.lfname;  
strcpy(ShuZu1,"0:/MUSIC/"); //复制路径(目录)
strcat(ShuZu1,(const char*)fn);   //将文件名接在后面

res = f_open(&fsrc, ShuZu1, FA_OPEN_EXISTING | FA_READ); //长文件名
while(1)
{
res = f_read(&fsrc, buffer, sizeof(buffer), &br);//在这里无法读取数据 读出的res是9 说文件/目录对象是无效 原因?
......
if (res || br == 0) break;   // 是否到文件尾
}
   
}
}
问题是读取Song文件夹中的文件名是正确的,无法读取文件的数据,请问原因出在哪里?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165585
金钱
165585
注册时间
2010-12-1
在线时间
2119 小时
发表于 2013-6-27 10:45:54 | 显示全部楼层
while(1)改为while(res==FR_OK)试试
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-6-27 13:08:53 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
res = f_read(&fsrc, buffer, sizeof(buffer), &br);中的reg读出数据是9  while(1)改为while(res==FR_OK)肯定不行啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165585
金钱
165585
注册时间
2010-12-1
在线时间
2119 小时
发表于 2013-6-27 15:03:29 | 显示全部楼层
其实我是想看你这句话执行正确没有:
res = f_open(&fsrc, ShuZu1, FA_OPEN_EXISTING | FA_READ); //长文件名
res==OK  ?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-6-27 15:36:12 | 显示全部楼层
strcpy(ShuZu1,"0:/MUSIC/");中的ShuZu1为什么定义成指针形式 就进入死循环
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-6-27 16:09:01 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
char * ShuZu1;
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-6-27 16:18:44 | 显示全部楼层
回复【5楼】zhcj66:
---------------------------------
进入死循环的原因是ShuZu1没有开辟内存空间
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165585
金钱
165585
注册时间
2010-12-1
在线时间
2119 小时
发表于 2013-6-27 16:23:21 | 显示全部楼层
回复【7楼】zhcj66:
---------------------------------
要分配内存.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-6-27 16:41:49 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子哥内存空间开辟成功了,但是还是无法正确读取数据
在读取res = f_open(&fsrc, ShuZu1, FA_OPEN_EXISTING | FA_READ);的时候返回5 意思是“找不到路径”请问原子哥这是为什么
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165585
金钱
165585
注册时间
2010-12-1
在线时间
2119 小时
发表于 2013-6-27 16:51:02 | 显示全部楼层
没这个路径了,呵呵.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-6-27 16:51:32 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
void lay_Music(void)

  FILINFO finfo;//文件结构
  DIR dirs;//目录对象结构
  unsigned int count=0;
  char * ShuZu1;

  f_mount(0, &fs);      //将文件系统设置到0区 
  if (f_opendir(&dirs, (const TCHAR*)"0:/Song") == FR_OK)   
  {
    while (f_readdir(&dirs, &finfo) == FR_OK)    //循环依次读取文件名
    {
        
ShuZu1=mymalloc(SRAMIN,finfo.lfsize); //为带路径的文件名分配内存
strcpy(ShuZu1,"0:/MUSIC/"); //复制路径(目录)
strcat(ShuZu1,(const char*)finfo.lfname);   //将文件名接在后面

res = f_open(&fsrc, ShuZu1, FA_OPEN_EXISTING | FA_READ);

        br=1;                    

  for (;;) {
          res = f_read(&fsrc, buffer, sizeof(buffer), &br);   
             ...
if (res || br == 0) break;   // 是否到文件尾    
         }

f_close(&fsrc);
      } 
  } 

在读取res = f_open(&fsrc, ShuZu1, FA_OPEN_EXISTING | FA_READ);的时候返回5 意思是“找不到路径”请问原子哥这是为什么
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165585
金钱
165585
注册时间
2010-12-1
在线时间
2119 小时
发表于 2013-6-27 16:52:20 | 显示全部楼层
"0:/MUSIC/"
应该是:"0:\MUSIC\"吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-6-27 16:53:07 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
ShuZu1=mymalloc(SRAMIN,finfo.lfsize);  //为带路径的文件名分配内存 
strcpy(ShuZu1,"0:/MUSIC/");  //复制路径(目录) 
strcat(ShuZu1,(const char*)finfo.lfname);    //将文件名接在后面 

res = f_open(&fsrc, ShuZu1, FA_OPEN_EXISTING | FA_READ);
这样不对吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165585
金钱
165585
注册时间
2010-12-1
在线时间
2119 小时
发表于 2013-6-27 16:54:48 | 显示全部楼层
我错了,你的是对的.
那你试试打开根目录的文件,看看成功不吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-6-27 17:03:17 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
strcpy(ShuZu1,"0:/MUSIC/");  //复制路径(目录) 这里和上面名称不对应
改完后又找不到文件了
void lay_Music(void) 
{  
  FILINFO finfo;//文件结构 
  DIR dirs;//目录对象结构 
  unsigned int count=0; 
  char * ShuZu1; 

  f_mount(0, &fs);       //将文件系统设置到0区  
  if (f_opendir(&dirs, (const TCHAR*)"0:/Song") == FR_OK)    
  { 
    while (f_readdir(&dirs, &finfo) == FR_OK)    //循环依次读取文件名 
    {
         
ShuZu1=mymalloc(SRAMIN,finfo.lfsize);  //为带路径的文件名分配内存 
strcpy(ShuZu1,"0:/Song");  //复制路径(目录) 
strcat(ShuZu1,(const char*)finfo.lfname);    //将文件名接在后面 

res = f_open(&fsrc, ShuZu1, FA_OPEN_EXISTING | FA_READ);

        br=1;                     

   for (;;) {
          res = f_read(&fsrc, buffer, sizeof(buffer), &br);    
             ... 
if (res || br == 0) break;   // 是否到文件尾      
         } 

f_close(&fsrc); 
      }  
  }  
}  
"0:\MUSIC\"这样语法是错误的
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-3-24
在线时间
1 小时
发表于 2013-6-27 21:37:31 | 显示全部楼层
回复【15楼】zhcj66:
---------------------------------
if (res || br == 0) break;   中br==0是不是有问题?
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-6-28 07:59:39 | 显示全部楼层
回复【16楼】liuyinggui163:
---------------------------------
if (res || br == 0) break;   中br==0是没有问题的
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-6-28 08:29:44 | 显示全部楼层
原子哥找到问题了strcpy(ShuZu1,"0:/Song");  //复制路径(目录)   
在目录下的文件需要在加一个/   strcpy(ShuZu1,"0:/Song/"); 这样就对了
void lay_Music(void)  
{   
  FILINFO finfo;//文件结构  
  DIR dirs;//目录对象结构  
  unsigned int count=0;  
  char * ShuZu1;  

  f_mount(0, &fs);       //将文件系统设置到0区   
  if (f_opendir(&dirs, (const TCHAR*)"0:/Song") == FR_OK)     
  {  
    while (f_readdir(&dirs, &finfo) == FR_OK)    //循环依次读取文件名  
    {
          
ShuZu1=mymalloc(SRAMIN,finfo.lfsize);  //为带路径的文件名分配内存  
strcpy(ShuZu1,"0:/Song/");  //复制路径(目录)  
strcat(ShuZu1,(const char*)finfo.lfname);    //将文件名接在后面  

res = f_open(&fsrc, ShuZu1, FA_OPEN_EXISTING | FA_READ);

        br=1;                      

   for (;;) {
          res = f_read(&fsrc, buffer, sizeof(buffer), &br);     
             ...  
if (res || br == 0) break;   // 是否到文件尾       
         }  

f_close(&fsrc);  
      }   
  }   
}
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-6-28 08:35:44 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
"0:/MUSIC/" 是这样的斜杠
不是
"0:\MUSIC\"
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165585
金钱
165585
注册时间
2010-12-1
在线时间
2119 小时
发表于 2013-6-28 10:08:38 | 显示全部楼层
回复【19楼】zhcj66:
---------------------------------
我在13楼就说了,我错了...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-6-28 15:51:43 | 显示全部楼层
回复【20楼】正点原子:
---------------------------------
没有看清楚
原子哥新的问题来了
FATFS fs;                      // 逻辑驱动器的标志
FIL fsrc, fdst;                // 文件标志 
unsigned char buffer[512];     // 文件内容缓冲区
FRESULT res;                   // FatFs 功能函数返回结果变量
unsigned int br, bw;           // 文件读/写计数器
char str[100][100];    //存放文件名称
void lay_Music(void)

FILINFO finfo;
DIR dirs;
unsigned int count=0;
char path[50]={""},j=0;
char *result1; 
char EXT1[4]=".mp3"; 
unsigned short i;
/*开启长文件名功能时, 要预先初始化文件名缓冲区的长度 */
#if _USE_LFN
static char lfn[_MAX_LFN * (_DF1S ? 2: 1) + 1];
finfo.lfname = lfn;
finfo.lfsize = sizeof(lfn);
#endif
USART_OUT(USART1,"\n文件系统(Tini-FatFS0.08b)启动成功! \n");

disk_initialize(0);      //fatfs可以管理多个介质的分区, 所以把物理存储介质SST25VF016B标示为0区,相当于磁盘编号
VS1003_start();
f_mount(0, &fs);      //将文件系统设置到0区 
if (f_opendir(&dirs, path) == FR_OK)            //读取该磁盘的根目录        
{
while (f_readdir(&dirs, &finfo) == FR_OK)    //循环依次读取文件名
{  
if (finfo.fattrib & AM_ARC)       //判断文件属性是否为存档型  TXT文件一般都为存档型
{
if(!finfo.fname[0])  break;          //如果是文件名为空表示到目录的末尾。退出
if(finfo.lfname[0])//长文件名
{    
USART_OUT(USART1,"\r\n文件名是:\n   %s\n",finfo.lfname);  //输出长文件名
result1=strstr(finfo.lfname,EXT1);  //判断是否是mp3后缀的文件名
}
else//8.3格式文件名
{                              
USART_OUT(USART1,"\r\n文件名是:\n   %s\n",finfo.fname);      //输出8.3格式文件名
result1=strstr(finfo.fname,EXT1);  //判断是否是mp3后缀的文件名
}
if(result1!=NULL)
{
if(finfo.lfname[0])
{    //长文件名

//  strcpy(str,(const char *)finfo.lfname);  //将文件名暂存到数组里,以备LISTBOX调用  
//  i++;
}
else
{       //8.3格式文件名

//  strcpy(str,(const char *)finfo.fname);      //将文件名暂存到数组里,以备LISTBOX调用
//  i++;
}         //文件建立及增加内容。
}





为什么添加上strcpy(str,(const char *)finfo.fname);这个函数读取就不正常了呢 求解
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-6-28 16:29:01 | 显示全部楼层
FATFS fs;                      // 逻辑驱动器的标志
FIL fsrc, fdst;                // 文件标志 
unsigned char buffer[512];     // 文件内容缓冲区
FRESULT res;                   // FatFs 功能函数返回结果变量
unsigned int br, bw;           // 文件读/写计数器
char str[100][100];    //存放文件名称
void lay_Music(void)

FILINFO finfo;
DIR dirs;
unsigned int count=0;
char path[50]={""},j=0;
char *result1;
char *ShuZu1;
char EXT1[4]=".mp3"; 
unsigned short i;
//开启长文件名功能时, 要预先初始化文件名缓冲区的长度
#if _USE_LFN
static char lfn[_MAX_LFN * (_DF1S ? 2: 1) + 1];
finfo.lfname = lfn;
finfo.lfsize = sizeof(lfn);
#endif
USART_OUT(USART1,"\n文件系统(Tini-FatFS0.08b)启动成功! \n");

disk_initialize(0);      //fatfs可以管理多个介质的分区, 所以把物理存储介质SST25VF016B标示为0区,相当于磁盘编号
VS1003_start();
f_mount(0, &fs);      //将文件系统设置到0区 
if (f_opendir(&dirs, path) == FR_OK)            //读取该磁盘的根目录        
{
while (f_readdir(&dirs, &finfo) == FR_OK)    //循环依次读取文件名
{  
if (finfo.fattrib & AM_ARC)       //判断文件属性是否为存档型  TXT文件一般都为存档型
{
if(!finfo.fname[0])  break;          //如果是文件名为空表示到目录的末尾。退出
if(finfo.lfname[0])//长文件名
{    
USART_OUT(USART1,"\r\n文件名是:\n   %s\n",finfo.lfname);  //输出长文件名
result1=strstr(finfo.lfname,EXT1);  //判断是否是mp3后缀的文件名
}
else//8.3格式文件名
{                              
USART_OUT(USART1,"\r\n文件名是:\n   %s\n",finfo.fname);      //输出8.3格式文件名
//  result1=strstr(finfo.fname,EXT1);  //判断是否是mp3后缀的文件名
}
//  if(result1!=NULL)
{
if(finfo.lfname[0])
{    //长文件名
ShuZu1=mymalloc(SRAMIN,finfo.lfsize);
strcat(ShuZu1,(const char*)finfo.lfname);
//  strcpy(str,(const char *)finfo.lfname);  //将文件名暂存到数组里,以备LISTBOX调用
USART_OUT(USART1,"\r\n文件名是:\n   %s\n",ShuZu1);
    
  i++;
}
else
{       //8.3格式文件名

//  strcpy(str,(const char *)finfo.fname);      //将文件名暂存到数组里,以备LISTBOX调用
//  i++;
}         //文件建立及增加内容。
}



}
这样是正常的 请问为什么
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165585
金钱
165585
注册时间
2010-12-1
在线时间
2119 小时
发表于 2013-6-28 20:46:23 | 显示全部楼层
你打印strcpy后的内容,看看究竟就知道为什么了
八成是路径有问题.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-7-3 09:47:01 | 显示全部楼层
回复【23楼】正点原子:
---------------------------------
打印出来,总是少一个最后文件名称
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165585
金钱
165585
注册时间
2010-12-1
在线时间
2119 小时
发表于 2013-7-3 10:32:46 | 显示全部楼层
说明你的代码有问题,检查吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-7-9 16:08:30 | 显示全部楼层
回复【25楼】正点原子:
---------------------------------
原子哥请问 f_lseek这个函数如何使用,他的意义是什么
res = f_lseek(file, 0);
res = f_lseek(file, 5000);
偏移到文件头什么意思?
移动文件读/写指针到相对于文件起始处偏移为5000 字节处
这个数据代表什么 如何确定 偏移量?
回复 支持 反对

使用道具 举报

48

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
355
金钱
355
注册时间
2013-6-26
在线时间
0 小时
发表于 2013-7-9 16:29:51 | 显示全部楼层
将文件读/写指针从开头处往后偏移5000 字节吧
这个数据代表什么偏移字节数 吧
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-7-9 16:38:37 | 显示全部楼层
回复【27楼】SCMBBS_HJH:
---------------------------------
我在下面的地方找到答案了谢谢
http://www.openedv.com/posts/list/759.htm#3677
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165585
金钱
165585
注册时间
2010-12-1
在线时间
2119 小时
发表于 2013-7-9 16:59:48 | 显示全部楼层
回复【26楼】zhcj66:
---------------------------------
f_lseek就相当于你看电影的拖动功能.
假设电影长度是1W秒钟.
res = f_lseek(file, 0); 就是把电影拖到开头的地方,重新开始播放.
res = f_lseek(file, 5000);就是拖到电影的正中间,开始播放.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-7-10 08:11:49 | 显示全部楼层
回复【29楼】正点原子:
---------------------------------
经典回答
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-7-10 09:01:40 | 显示全部楼层
回复【29楼】正点原子:
---------------------------------
{
unsigned int a;
FILINFO finfo;
DIR dirs;
char path[50]={""};      //目录名为空,表示是根目录
  //开启长文件名功能时, 要预先初始化文件名缓冲区的长度 //
#if _USE_LFN
static char lfn[_MAX_LFN * (_DF1S ? 2: 1) + 1];
finfo.lfname = lfn;
finfo.lfsize = sizeof(lfn);
#endif
USART_OUT(USART1,"\nSTM32开发板文件系统(Tini-FatFS0.08b)启动成功! \n");
disk_initialize(0);      //fatfs可以管理多个介质的分区, 所以把物理存储介质SST25VF016B标示为0区,相当于磁盘编号
    
f_mount(0, &fs);      //将文件系统设置到0区 

if (f_opendir(&dirs, path) == FR_OK)            //读取该磁盘的根目录        
{
while (f_readdir(&dirs, &finfo) == FR_OK)    //循环依次读取文件名
{  
if (finfo.fattrib & AM_ARC)       //判断文件属性是否为存档型  TXT文件一般都为存档型
{
if(!finfo.fname[0])  break;          //如果是文件名为空表示到目录的末尾。退出  
if(finfo.lfname[0]){USART_OUT(USART1,"\r\n文件名是:\n   %s\n",finfo.lfname);}      //输出长文件名
else{USART_OUT(USART1,"\r\n文件名是:\n   %s\n",finfo.fname);}          //输出8.3格式文件名

res = f_open(&fdst, "0:/RECORDER/a2.txt", FA_CREATE_ALWAYS | FA_WRITE);   //以写的方式打开文件,如果不存在,就直接建立,如果存在就覆盖掉

br=1;
br=512;
  
for(a=0; a<512; a++) buffer[a]=0x36;    //因为可以一次读出512字节,先清空数据缓冲区
f_lseek(&fdst,0); //偏移到文件头.
res = f_write(&fdst, buffer, br, &bw);   //将缓冲区的内容写入到目标文件 也就是a2.txt

f_close(&fsrc);    //关闭源文件
}


}
原子哥为什么建立文件是正常的,就是无法往文件里面写数据,res = f_write(&fdst, buffer, br, &bw); res返回是0 bw返回是512 都正确就是无法往里面写数据 请问这是什么原因?
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-7-10 09:05:09 | 显示全部楼层
还有给原子哥网站提个意见 1.代码没有缩进,阅读起来有些不方面2.代码前面添加序号
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2013-7-10 09:28:14 | 显示全部楼层
finfo.lfname貌似要自己分配空间才行?然后,貌似不是所有的文件的lfname都有效,但fname一定是有效的。
业余程序玩家。
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-7-10 09:32:12 | 显示全部楼层
回复【33楼】ofourme:
---------------------------------
不太明白“finfo.lfname貌似要自己分配空间才行?然后,貌似不是所有的文件的lfname都有效,但fname一定是有效的。” 能否细说
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-7-10 09:45:57 | 显示全部楼层
{
unsigned int a;
FILINFO finfo;
DIR dirs;
char path[50]={""};      //目录名为空,表示是根目录
  //开启长文件名功能时, 要预先初始化文件名缓冲区的长度 //
#if _USE_LFN
static char lfn[_MAX_LFN * (_DF1S ? 2: 1) + 1];
finfo.lfname = lfn;
finfo.lfsize = sizeof(lfn);
#endif
USART_OUT(USART1,"\nSTM32开发板文件系统(Tini-FatFS0.08b)启动成功! \n");
disk_initialize(0);      //fatfs可以管理多个介质的分区, 所以把物理存储介质SST25VF016B标示为0区,相当于磁盘编号
    
f_mount(0, &fs);      //将文件系统设置到0区 

if (f_opendir(&dirs, path) == FR_OK)            //读取该磁盘的根目录        
{
while (f_readdir(&dirs, &finfo) == FR_OK)    //循环依次读取文件名
{  
if (finfo.fattrib & AM_ARC)       //判断文件属性是否为存档型  TXT文件一般都为存档型
{
res = f_open(&fdst, "0:/RECORDER/a2.txt", FA_CREATE_ALWAYS | FA_WRITE);   //以写的方式打开文件,如果不存在,就直接建立,如果存在就覆盖掉

br=1;
br=512;
  
for(a=0; a<512; a++) buffer[a]=0x36;    //因为可以一次读出512字节,先清空数据缓冲区
f_lseek(&fdst,0); //偏移到文件头.
res = f_write(&fdst, buffer, br, &bw);   //将缓冲区的内容写入到目标文件 也就是a2.txt

f_close(&fsrc);    //关闭源文件
}


}
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-7-10 10:56:34 | 显示全部楼层
回复【29楼】正点原子:
---------------------------------
原子哥请帮我看看
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-7-10 11:47:36 | 显示全部楼层
找到原因了
res = f_write(&fdst, buffer, br, &bw);    //将缓冲区的内容写入到目标文件 也就是a2.txt 
f_close(&fsrc);     //关闭源文件
写的是fdst保存的是fsrc 当然就无法保存了
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-7-10 14:47:16 | 显示全部楼层
回复【29楼】正点原子:
---------------------------------
您好请问使用FATFS操作sd卡的 txt文件  txt中有部分内容了  如何在内容的后面继续添加新内容 而不损坏原有内容  这个最后点如何确定 
我现在知道先读 buffer然后再写入buffer 这样可以实现 如果文件里面的内容较多的时候 读写这种操作方式会浪费很多时间 请问还有什么好的办法吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165585
金钱
165585
注册时间
2010-12-1
在线时间
2119 小时
发表于 2013-7-10 21:16:48 | 显示全部楼层
回复【38楼】zhcj66:
---------------------------------
f_lseek,直接查找到文件的末尾,然后继续f_write写数据就是了,最后记得f_close.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-7-11 09:03:04 | 显示全部楼层
回复【39楼】正点原子:
---------------------------------
请问原子哥 如何查找文件的末尾?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165585
金钱
165585
注册时间
2010-12-1
在线时间
2119 小时
发表于 2013-7-11 10:35:53 | 显示全部楼层
你知道如何获取文件大小吧?
那么利用f_lseek,偏移文件大小那么大,那不就到末尾了?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-7-11 13:12:22 | 显示全部楼层
#define f_size(fp) ((fp)->fsize) 获取文件的大小
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-7-11 13:15:01 | 显示全部楼层
f_lseek(&fsrc,f_size(&fsrc));偏移到数据尾部 然后写入数据
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-7-11 15:04:23 | 显示全部楼层
其他内容请关注
http://www.amobbs.com/forum.php?mod=viewthread&tid=5540142&page=1&extra=#pid6812375
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165585
金钱
165585
注册时间
2010-12-1
在线时间
2119 小时
发表于 2013-7-11 17:18:49 | 显示全部楼层
看来楼主对am论坛情有独钟啊,呵呵.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1863
金钱
1863
注册时间
2012-5-19
在线时间
287 小时
 楼主| 发表于 2013-7-12 08:17:16 | 显示全部楼层
只要是能获取知识的论坛都可以,并不是倾向阿莫
回复 支持 反对

使用道具 举报

14

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2014-2-19
在线时间
0 小时
发表于 2014-3-27 12:41:51 | 显示全部楼层
受教  谢谢讨论的各位大神  祝合家欢乐
回复 支持 反对

使用道具 举报

17

主题

293

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2012-12-26
在线时间
1 小时
发表于 2014-11-25 19:09:26 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
为什么我打开文件的时候用“/”,比如这样的路径“0:/RoutPlan/a-b.xml”而不是“\”也可以成功打开文件,并且能正确读取数据勒,
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165585
金钱
165585
注册时间
2010-12-1
在线时间
2119 小时
发表于 2014-11-25 22:41:35 | 显示全部楼层
回复【48楼】kassandra:
---------------------------------
说明都可以支持了,呵呵
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2015-1-18
在线时间
6 小时
发表于 2015-1-20 15:11:36 | 显示全部楼层
好东西。mark
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-10-15 10:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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