OpenEdv-开源电子网

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

请教原子FATFS问你,不胜感激

[复制链接]

23

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2012-3-15
在线时间
13 小时
发表于 2012-3-30 18:50:29 | 显示全部楼层 |阅读模式
 
我想把SD卡根目录下的文件夹名和歌曲分别保存在两个二维数组中,这两个函数分别扫描出文件夹名和歌曲名,但是不知道什么原因在扫描完歌曲的时候用来保存文件夹名字的数组里面也被赋值进歌曲的名字,先执行scan_root_folder();,然后执行scan_song();在红色的地方song_name_buf[song_num][j] = finfo.fname[j];这句注释掉文件夹名字的数组就不会有歌曲的值还是原来执行scan_root_folder();的值,但是没有找到文件夹名字数组在scan_song();里有赋值的地方,不胜感激~

/********************************************************
函数名称:void scan_root_folder(void)
功能描述:列举根目录下文件夹
全局变量:folder_name_buf[][13]:根目录文件夹缓存区;        folder_total_num:文件夹总数
参数说明:无
返回值:  无
说明:          得到根目录下文件夹总数以及保存文件夹名称到folder_name_buf[][13]
                  folder_name_buf[1][13]为根目录
*********************************************************/
void scan_root_folder(void)
{
        FATFS fs;
    FILINFO finfo;
    DIR dirs;
        FRESULT res;     // FatFs function common result code
        u8 i, j;
        u8 root_name[13] = {"/"};//根目录名称
    u8 folder_num = 0;//当前文件夹序号
    f_mount(0, &fs);//卸载或挂在一个逻辑驱动器
       
    for(j = 0; j < 14; j++)//存根目录名称到folder_name_buf[1][]
        {
                folder_name_buf[1][j] =        root_name[j];               
        }
            
    res = f_opendir(&dirs, (TCHAR*)&folder_name_buf[folder_name_num][0]); //打开文件目录

    if(res == FR_OK)  
        {
                printf("\r\n\r\n%20s\r\n", "-----------文件夹列表-----------");
                printf("\r\n%s", &folder_name_buf[1][0]); //根目录
        while((f_readdir(&dirs, &finfo) == FR_OK) && finfo.fname[0])  
                {
                        i = strlen(finfo.fname);
            if(finfo.fattrib & AM_DIR)//如果是文件夹  
                        {
                                folder_num++;
                                for(j = 0;j < 14;j++)
                                {
                                        folder_name_buf[folder_num + 1][j] = finfo.fname[j];
                                }                                       
                                       
                                printf("\r\n%s", &folder_name_buf[folder_num + 1][0]); //其他文件夹
                           
                                //printf("\r\n%s/%s", path, &finfo.fname[0]);
                                switch(i)//作用:输出文件名左对齐
                                {
                                        case 1:printf(" ");
                                        case 2:printf(" ");
                                        case 3:printf(" ");
                                        case 4:printf(" ");
                                        case 5:printf(" ");
                                        case 6:printf(" ");
                                        case 7:printf(" ");
                                        case 8:printf("%15s"," ");
                                }
            }  
                        else  
                        {  
                          
            }
                }
                if(folder_num == 0)//无文件夹
                {
                    printf("\r\n%s\r\n","<无文件夹>");  
                        printf("\r\n\r\n%s%s\r\n","文件夹总计:", "0");     
                }
                else
                {
                        printf("\r\n\r\n%s%d\r\n","文件夹总计:", (folder_num + 1));         
                }
    }     

    f_mount(0, NULL);
        folder_total_num = (folder_num + 1); //总文件夹数加上根目录
}

/********************************************************
函数名称:void scan_song(void)  
功能描述:列举指定目录下歌曲文件
全局变量:folder_name_buf[][13]:根目录文件夹缓存区;song_name_buf[][13]:歌曲名称缓存区
                  song_total_num:歌曲总数;folder_name_num:当前文件夹序号       
参数说明:无
返回值:  无
说明:          得到当前文件夹下歌曲总数以及保存当前文件夹下歌曲到song_name_buf[][13]
*********************************************************/
void scan_song(void)
{
        FATFS fs;
    FILINFO finfo;
    DIR dirs;
        FRESULT res;     // FatFs function common result code
        u8 i, j, n;       
    u8 song_num = 0;//当前歌曲序号  
    f_mount(0, &fs);//卸载或挂在一个逻辑驱动器
         
        for(n = 0; n <= song_total_num; n++)//先清除文件夹缓存区中上一个文件夹下歌曲名称
        {
                for(j = 0; j < 14; j++)
                {
                        song_name_buf[n][j] = 0;       
                }
        }               
        res = f_opendir(&dirs, (const TCHAR*)&folder_name_buf[folder_name_num][0]);        //打开目录
    if (res == FR_OK)  
        {
                printf("\r\n\r\n%20s\r\n", "-----------歌曲列表-----------");
        while((f_readdir(&dirs, &finfo) == FR_OK) && finfo.fname[0])  
                {        
                        i = strlen(finfo.fname);//名字长度
            if(finfo.fattrib != AM_DIR)
                        {
                                if(((finfo.fname[9] == 'W') && (finfo.fname[10] == 'M') && (finfo.fname[11] == 'A'))
                                || ((finfo.fname[9] == 'M') && (finfo.fname[10] == 'P') && (finfo.fname[11] == '3'))
                            || ((finfo.fname[9] == 'W') && (finfo.fname[10] == 'A') && (finfo.fname[11] == 'V')))
                                {                               
                                        song_num++;
                                        for(j = 0;j < 14;j++)
                                        {
                                                song_name_buf[song_num][j] = finfo.fname[j];                                        }               
                                        printf("\r\n%s/%s", (const TCHAR*)&folder_name_buf[folder_name_num][0], &song_name_buf[song_num][0]);
                                       
                                        switch(i)//作用:输出文件名左对齐
                                        {
                                                case 1:printf(" ");
                                                case 2:printf(" ");
                                                case 3:printf(" ");
                                                case 4:printf(" ");
                                                case 5:printf(" ");
                                                case 6:printf(" ");
                                                case 7:printf(" ");
                                                case 8:printf("%15s"," ");
                                        }
                                }
            }  
                        else  
                        {  
               
                        }
                         
                }

                if(song_num == 0)//无歌曲文件
                {
                    printf("\r\n%s\r\n","<无歌曲文件>");
                        printf("\r\n\r\n%s%s\r\n","歌曲文件总计:", "0");      
                }
                else
                {
                        printf("\r\n\r\n%s%d\r\n","歌曲文件总计:", song_num);         
                }

    }

    f_mount(0, NULL);
        song_total_num = song_num;
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-30 20:59:26 | 显示全部楼层
你的代码不考虑堆栈的啊?
你这代码,很可能死机
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2012-3-15
在线时间
13 小时
 楼主| 发表于 2012-3-31 08:38:53 | 显示全部楼层
我的想法是,先通过fatfs得出根目录下的歌曲名和文件夹名,然后保存起来,用于播放上一首下一首,和二级目录下的歌曲,用来存放歌曲名和文件夹名的数组都是全局变量,先不考虑能存多少的问题,到时候处理一下上限就可以,不知道原子哥还有没有什么好的思路能给点意见,还有我的程序是不是有很大的问题
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-31 08:47:54 | 显示全部楼层
思路是无问题的 .你全局变量在哪里定义的?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2012-3-15
在线时间
13 小时
 楼主| 发表于 2012-3-31 12:28:19 | 显示全部楼层
单独放在一个.c文件里,把所有的全局变量都放在一个文件里,现在可以了,不过把歌曲名保存起来还是很占空间的。
回复 支持 反对

使用道具 举报

23

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2012-3-15
在线时间
13 小时
 楼主| 发表于 2012-3-31 12:31:15 | 显示全部楼层
还有一个问题,我现在用的fatfs没有用长文件名,发现有些歌曲不能播放,但是改一个名字可能就可以播放了,是不是这种挑歌问题是因为没有支持长文件名而引起的呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-31 13:51:42 | 显示全部楼层
回复【6楼】hooddas:
---------------------------------
你测试一下.如果是长文件名的问题,应该只要是长文件名都不行.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2012-3-15
在线时间
13 小时
 楼主| 发表于 2012-3-31 15:26:10 | 显示全部楼层
回复【7楼】正点原子:

---------------------------------
是和名字有关系,但是好像不是长短的问题,我的这首歌是K歌之王.MP3,用上面的函数扫描不出来,我把名字改成A.MP3也同样播放不出来,改成歌之王.MP3也播放不出来,改成测试.MP3就可以被扫描出来,随便打的名字有些可以有些不可以。超过8个汉字有的也可以播放。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-31 15:34:58 | 显示全部楼层
这种情况建议用jtag调试一下.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2012-3-15
在线时间
13 小时
 楼主| 发表于 2012-3-31 16:09:28 | 显示全部楼层
回复【9楼】正点原子:

---------------------------------
哎,根本没设计jtag口 IO口都不够用了
悲催呀
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 07:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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