打印
[开发工具]

fat读取问题

[复制链接]
1300|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
julonger|  楼主 | 2014-7-28 15:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
FAT要读出MP3文件,用f_read()一次不能全部读出来吗?

if(File_type_Check( (u8 *)finfo.fname, "mp3"))
          {
                        res = f_open(&fsrc, finfo.fname, FA_OPEN_EXISTING | FA_READ);
                        fsiz=finfo.fsize;
                        BufferSet(buffer, 0, fsiz);
                        ft=fsiz/512;
                         while(ft--)
                            {
                              f_read(&fsrc,buffer,fsiz,&br);
                              if(br==0)break;
                              if(br<fsiz)printf("%s", buffer);
                              else printf("%s", buffer);
                            }
                   f_close(&fsrc);                                      
          }
沙发
airwill| | 2014-7-28 15:46 | 只看该作者
f_read()一次不能全部读出来吗?

应该不能, 要读出来, 恐怕 SRAM 也不够存吧, 通常都是读一段, 播放一段.

使用特权

评论回复
板凳
想做大牛的小马| | 2014-7-28 15:55 | 只看该作者
airwill 发表于 2014-7-28 15:46
f_read()一次不能全部读出来吗?

应该不能, 要读出来, 恐怕 SRAM 也不够存吧, 通常都是读一段, 播放一段. ...

有道理,ram足够大,或者要读的文件不大是可以的,也就是说理论上可以,只是受到资源的限制~

使用特权

评论回复
地板
julonger|  楼主 | 2014-7-28 17:36 | 只看该作者
想做大牛的小马 发表于 2014-7-28 15:55
有道理,ram足够大,或者要读的文件不大是可以的,也就是说理论上可以,只是受到资源的限制~ ...

为什么我读出来都不成功,我要用串口发,或者spi,哪个好写点。头疼第一个项目就这么难。

使用特权

评论回复
5
julonger|  楼主 | 2014-7-28 18:05 | 只看该作者
airwill 发表于 2014-7-28 15:46
f_read()一次不能全部读出来吗?

应该不能, 要读出来, 恐怕 SRAM 也不够存吧, 通常都是读一段, 播放一段. ...

if(File_type_Check( (u8 *)finfo.fname, "mp3"))
          {
                        res = f_open(&fsrc, finfo.fname, FA_OPEN_EXISTING | FA_READ);
                        fsiz=finfo.fsize;
                        ft=fsiz/512;
                        while(1)
                            {
                              f_read(&fsrc,buf1,512,&br);
                              if(br==0)break;
                              if(br<512)printf("%s", buf1);
                              else printf("%s", buf1);
                                  f_close(&fsrc);       
                            }                               
          }          
我现在只能读出其中的一段,怎么可以把它分段读出来。

使用特权

评论回复
6
julonger|  楼主 | 2014-7-29 09:50 | 只看该作者
想做大牛的小马 发表于 2014-7-28 15:55
有道理,ram足够大,或者要读的文件不大是可以的,也就是说理论上可以,只是受到资源的限制~ ...

if(File_type_Check( (u8 *)finfo.fname, "mp3"))
          {
                        res = f_open(&fsrc, finfo.fname, FA_OPEN_EXISTING | FA_READ);
                        fsiz=finfo.fsize/512;
                        imax=fsiz;
                        flsiz=finfo.fsize%512;
                        i=0;
                        while(fsiz--)
                            {
                                         
                              f_read(&fsrc,buf1,512,&br);
                              if(br==0)break;
                              if(br<512)printf("%s", buf1);
                              else printf("%s", buf1);
                                  i++;
                                  if(fsiz!=0)
                                  {
                                  res = f_lseek(&fsrc, 0);
                                  res = f_lseek(&fsrc, 512*i);
                                  }
                                  if(i>imax && flsiz!=0)
                                          {
                                                f_read(&fsrc,buf1,flsiz,&br);
                                                if(br==0)break;
                                                if(br<512)printf("%s", buf1);
                                              else printf("%s", buf1);
                                        }         
                            }
                        f_close(&fsrc);                              
          }

为什么我用上面这个函数读取mp3的内容,打出来100多K的MP3文件大小,打印出来的东西还没有几十K的TXT的内容多,而且txt内容没有完全打完整。

使用特权

评论回复
7
想做大牛的小马| | 2014-7-29 09:54 | 只看该作者
julonger 发表于 2014-7-28 18:05
if(File_type_Check( (u8 *)finfo.fname, "mp3"))
          {
                        res = f_open(&fsrc, finfo.fname, FA ...

你希望每次读多少出来?比如是1k,读完后用lseek移动一下文件指针,然后接着读

使用特权

评论回复
8
julonger|  楼主 | 2014-7-29 10:10 | 只看该作者
想做大牛的小马 发表于 2014-7-29 09:54
你希望每次读多少出来?比如是1k,读完后用lseek移动一下文件指针,然后接着读 ...

每次就512byte,读多次然后全部读完

使用特权

评论回复
9
想做大牛的小马| | 2014-7-29 10:16 | 只看该作者
while(read < file_length)
{f_read(file-obj, buf, 512, cnt)
f_lseek(file-obj, 512)}
写的挺明白了吧。。。搞定这个问题后一定要请我吃个巧乐兹啊

使用特权

评论回复
10
julonger|  楼主 | 2014-7-29 11:21 | 只看该作者
想做大牛的小马 发表于 2014-7-29 10:16
while(read < file_length)
{f_read(file-obj, buf, 512, cnt)
f_lseek(file-obj, 512)}

这个我知道,为什么打印MP3文件,好像变少了,我在电脑上用文本打开MP3文件里面内容超多,但是用这个发过来好像变少了不少。为什么?还是就那么多?

使用特权

评论回复
11
julonger|  楼主 | 2014-7-29 11:22 | 只看该作者
julonger 发表于 2014-7-29 11:21
这个我知道,为什么打印MP3文件,好像变少了,我在电脑上用文本打开MP3文件里面内容超多,但是用这个发过 ...

搞定了我请你吃两个巧乐兹

使用特权

评论回复
12
想做大牛的小马| | 2014-7-29 11:54 | 只看该作者
julonger 发表于 2014-7-29 11:21
这个我知道,为什么打印MP3文件,好像变少了,我在电脑上用文本打开MP3文件里面内容超多,但是用这个发过 ...

。。。finfo.fsize这个和实际的文件大小比一下好了。。。你的while循环体写的好像有点问题。。。~

使用特权

评论回复
13
julonger|  楼主 | 2014-7-29 15:05 | 只看该作者
想做大牛的小马 发表于 2014-7-29 11:54
。。。finfo.fsize这个和实际的文件大小比一下好了。。。你的while循环体写的好像有点问题。。。~[em:yct ...

disk_initialize(0);
   
  printf("\n\r f_mount %d\r\n", f_mount(0, &fs[0]));
  printf("\n\r----------------------------------------------------\n\r");
  
if (f_opendir(&dirs, path) == FR_OK)
  {
    while (f_readdir(&dirs, &finfo) == FR_OK)  
    {
      if (finfo.fattrib & AM_ARC)
      {
        if(!finfo.fname[0])       
          break;         
          printf("\n\r file name is: %s\n",finfo.fname);
          printf("\n\r file size is: %d ", finfo.fsize);
                  printf("\n\r 文件内容:\n\r");

                  if(File_type_Check( (u8 *)finfo.fname, "txt"))
          {
                        res = f_open(&fsrc, finfo.fname, FA_OPEN_EXISTING | FA_READ);
                        i=0;
                        f_lseek(&fsrc,0);
                        do
                        {
                                f_lseek(&fsrc,512*i);
                                f_read(&fsrc,buf1,512,&br);
                                i++;
                                printf("%s", buf1);
                               
                        }
                        while(i< (finfo.fsize/512));
                        f_lseek(&fsrc,512*i);
                        BufferSet(buf1, 0, 512);
                        f_read(&fsrc,buf1,(finfo.fsize%512),&br);
                        printf("%s", buf1);
                        f_close(&fsrc);                              
          }          
      }
      else
      {
        printf("\n\r Path name is: %s", finfo.fname);
        continue;
      }
    }
}
else
{
      printf("\n\r err: f_opendir\n\r");
}
printf("\n\r----------------------------------------------------\n\r");
}
读取txt文件好像没问题,但是读取MP3,500多K 变成了100多K

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

54

帖子

0

粉丝