OpenEdv-开源电子网

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

FATFS&图片显示

[复制链接]

7

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
146
金钱
146
注册时间
2012-11-13
在线时间
12 小时
发表于 2013-4-17 16:35:55 | 显示全部楼层 |阅读模式
原子大哥,下面两个地方(红色标注)的程序没有看明白,请原子大哥帮忙指导下,怎么个原理,想了半天,没有想明白,先谢谢原子大哥了!

FATFS 实验中:
 //文件类型列表
const u8 *FILE_TYPE_TBL[6][13]=
{
{"BIN"},   //BIN文件
{"LRC"},   //LRC文件
{"NES"},   //NES文件
{"TXT","C","H"}, //文本文件
{"MP1","MP2","MP3","MP4","M4A","3GP","3G2","OGG","ACC","WMA","WAV","MID","FLAC"},//音乐文件
{"BMP","JPG","JPEG","GIF"},//图片文件
};

//报告文件的类型
//fname:文件名
//返回值:0XFF,表示无法识别的文件类型编号.
//   其他,高四位表示所属大类,低四位表示所属小类.
u8 f_typetell(u8 *fname)
{
 u8 tbuf[5];
 u8 *attr='\0';//后缀名
 u8 i=0,j;
 while(i<250)
 {
  i++;
  if(*fname=='\0')break;//偏移到了最后了.
  fname++;
 }
 if(i==250)return 0XFF;//错误的字符串.
  for(i=0;i<5;i++)//得到后缀名
 {
  fname--;
  if(*fname=='.')
  {
   fname++;
   attr=fname;
   break;
  }
   }
 strcpy((char *)tbuf,(const char*)attr);//copy
  for(i=0;i<4;i++)tbuf=char_upper(tbuf);//全部变为大写
 for(i=0;i<6;i++)
 {
  for(j=0;j<13;j++)
  {
   if(*FILE_TYPE_TBL[j]==0)break;//此组已经没有可对比的成员了.
   if(strcmp((const char *)FILE_TYPE_TBL[j],(const char *)tbuf)==0)//找到了
   {
  1)  return (i<<4)|j; 这个怎么理解?和上面的标注“//   其他,高四位表示所属大类,低四位表示所属小类.”是怎么个方式,我是完全没有看明白,希望原子大哥指导的详细些。
   }
  }
 }
 return 0XFF;//没找到        


图片显示实验中:
/得到path路径下,目标文件的总个数
//path:路径     
//返回值:总有效文件数
u16 pic_get_tnum(u8 *path)
{  
 u8 res;
 u16 rval=0;
  DIR tdir;    //临时目录
 FILINFO tfileinfo; //临时文件信息 
 u8 *fn;                   
    res=f_opendir(&tdir,(const TCHAR*)path); //打开目录
   tfileinfo.lfsize=_MAX_LFN*2+1;      //长文件名最大长度
 tfileinfo.lfname=mymalloc(SRAMIN,tfileinfo.lfsize); //为长文件缓存区分配内存
 if(res==FR_OK&&tfileinfo.lfname!=NULL)
 {
  while(1)//查询总的有效文件数
  {
         res=f_readdir(&tdir,&tfileinfo);         //读取目录下的一个文件
         if(res!=FR_OK||tfileinfo.fname[0]==0)break; //错误了/到末尾了,退出   
       fn=(u8*)(*tfileinfo.lfname?tfileinfo.lfname:tfileinfo.fname);   
   res=f_typetell(fn); 
 2)  if((res&0XF0)==0X50)//取高四位,看看是不是图片文件    这个地方也没有看明白,是否和上面 1) 处没有看明白有关系,希望原子大哥帮忙指导下。
   {
    rval++;//有效文件数增加1
   }    
  } 
 }
 return rval;
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-17 19:32:42 | 显示全部楼层
FILE_TYPE_TBL[6][13]
其中6,是指大类.
13是指小类.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-17 19:33:51 | 显示全部楼层
返回值的高四位,用于保存大类类型.
低四位用于保存小类类型.
比如返回:0X31
则表示大类是3,小类是1.
即该文件是:".c"文件.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
146
金钱
146
注册时间
2012-11-13
在线时间
12 小时
 楼主| 发表于 2013-4-18 15:04:56 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子大哥,今天看这段程序的时候,不知道为什么,就看明白了,可昨天死活转不过弯,不过还是谢谢你耐心的讲解!让人受益匪浅
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2014-6-21 01:57:41 | 显示全部楼层
回复【4楼】zjm_z:
---------------------------------
兄弟,原子虽然解释了,但是我还是不明白:

 for(i=0;i<5;i++)//得到后缀名
 {
     fname--;
     if(*fname=='.')
     {
        fname++;
        attr=fname;
        break;
     }
 }
这段代码中,只要找到了“.”符号,fname指针加1,这时fname指向的是后缀名的第一个字符?
手艺人要内外兼修。
回复 支持 反对

使用道具 举报

7

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
146
金钱
146
注册时间
2012-11-13
在线时间
12 小时
 楼主| 发表于 2014-7-17 15:44:28 | 显示全部楼层
回复【6楼】wangyan915205:
---------------------------------
不好意思,这段时间忙,刚看到,你理解的是对的,是指向后缀名的第一个字符
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-5 06:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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