关于Fatfs和汉字显示实验的一些疑问

2019-07-20 05:58发布

在汉字显示实验中有这样的一个函数:
//更新字体文件,UNIGBK,GBK12,GBK16,GBK24一起更新
//x,y:提示信息的显示地址
//size:字体大小
<1>//src:字库来源磁盘."0:",SD卡;"1:",FLASH盘,"2:",U盘.
//提示信息字体大小                                                                                  
//返回值:0,更新成功;
//其他,错误代码          
u8 update_font(u16 x,u16 y,u8 size,u8* src)
{       
        u8 *pname;
        u32 *buf;
        u8 res=0;                  
        u16 i,j;
        FIL *fftemp;
        u8 rval=0;
        res=0XFF;               
        ftinfo.fontok=0XFF;
        pname=mymalloc(SRAMIN,100);        //申请100字节内存  
        buf=mymalloc(SRAMIN,4096);        //申请4K字节内存  
        fftemp=(FIL*)mymalloc(SRAMIN,sizeof(FIL));        //分配内存       
        if(buf==NULL||pname==NULL||fftemp==NULL)
        {
                myfree(SRAMIN,fftemp);
                myfree(SRAMIN,pname);
                myfree(SRAMIN,buf);
                return 5;        //内存申请失败
        }
        //先查找文件是否正常
        <2>strcpy((char*)pname,(char*)src);        //copy src内容到pname。
               strcat((char*)pname,(char*)UNIGBK_PATH);//将UNIGBK文件复制到pname末尾。
        res=f_open(fftemp,(const TCHAR*)pname,FA_READ);
        if(res)rval|=1<<4;//打开文件失败  
       
         ....(此处省略一大段)

        return rval;//无错误.                         
}



对于标注红字的部分不太了解。
1.在Fatfs文件系统中为什么要用"0:"、"1:" 这样的字符串来表示不同的磁盘,如f_mount(fs[0],"0:",1);
明明在diskio.c文件中的宏定义是这样的
#define SD_CARD         0  //SD卡,卷标为0
#define EX_FLASH 1        //外部flash,卷标为1
这两个宏定义是直接用0,1表示不同的磁盘,为什么在API函数就变了。

2.这个函数的入口参数*scr,究竟指向什么地方。在上面的解释(标注<1>)中说*scr的三个参数分别为"0:"、"1:"、"2:"表明字库来源的三个磁盘,是说
  *scr指向的是三个磁盘的首地址,还是说*scr指向三个磁盘中字库文件的首地址。

3.如果*scr指向的是三个磁盘首地址,那么标注<2>处的这两句话如何解释,我明白strcpy strcat这两个函数的意义,只是不明白这两个函数在这里
有什么意义,*pname究竟指向什么地方,在两句话中*pname中的数据又发生了什么样的变化呢。

4.如果*scr是指向三个磁盘中字库文件的首地址,那么这是否和Fatfs文件系统中的"0:"、"1:"相冲突,因为Fatfs文件系统中的"0:"、"1:"指代 的是不同的磁盘
  而非字库的首地址


在Fatfs文件系统中和汉字显示实验中有很多地方都有"0:"、"1:"这样的字符串,令我很困扰,希望能有大神解我心中之疑惑鄙人不胜感激








友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
Delos
1楼-- · 2019-07-20 07:02
//更新字体文件,UNIGBK,GBK12,GBK16,GBK24一起更新
//x,y:提示信息的显示地址
//size:字体大小
//src:字库来源磁盘."0:",SD卡;"1:",FLASH盘,"2:",U盘.
//提示信息字体大小                                                                                  
//返回值:0,更新成功;
//其他,错误代码          
u8 update_font(u16 x,u16 y,u8 size,u8* src)
{       
        u8 *pname;
        u32 *buf;
        u8 res=0;                  
        u16 i,j;
        FIL *fftemp;
        u8 rval=0;
        res=0XFF;               
        ftinfo.fontok=0XFF;
        pname=mymalloc(SRAMIN,100);        //申请100字节内存  
        buf=mymalloc(SRAMIN,4096);        //申请4K字节内存  
        fftemp=(FIL*)mymalloc(SRAMIN,sizeof(FIL));        //分配内存       
        if(buf==NULL||pname==NULL||fftemp==NULL)
        {
                myfree(SRAMIN,fftemp);
                myfree(SRAMIN,pname);
                myfree(SRAMIN,buf);
                return 5;        //内存申请失败
        }
        //先查找文件是否正常
        //printf(" pname之前的内容是:%s",(char*)pname);
        //printf(" src的内容是:%s",(char*)src);
        /* *src的取值为"0:"、"1:"、和"2:",所以这里面的内容实际上就是0:、1:、2:。
           *pname尚未赋值,其值为空,在串口中打印不出数据。事实说明除非在Fatfs文件
           系统的API函数中"0:"、"1:"这样的字符串表示磁盘的种类,在其他的函数中,这
           样的字符串仅仅是字符串而已,并无特殊含义。*/
        strcpy((char*)pname,(char*)src);        //copy src内容到pname。       
        //printf(" pname之后的内容是: %s",(char*)pname);
        /*原型声明:char *strcpy(char* dest, const char *src);
                头文件:#include "string.h"
                功能:把从src地址开始且含有""(NULL)结束符的字符串复制到以dest开始的地址空间
                说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
                返回指向dest的指针,返回值的类型为char*。*/       
        //printf(" UNIGBK_PATH中的数据:%s",(char*)UNIGBK_PATH);
        /*前面定义了u8*const UNIGBK_PATH="/SYSTEM/FONT/UNIGBK.BIN",UNIGBK_PATH仅仅是指向
    字符串/SYSTEM/FONT/UNIGBK.BIN,并没有特殊含义,字符串在这里也仅仅表达了一个普通
    字符串所表达的意义,并无特殊含义。只有在Fatfs文件系统中这样格式的字符串才表示文
          件路径。*/
        strcat((char*)pname,(char*)UNIGBK_PATH);//将UNIGBK文件复制到pname末尾。
        //printf(" 与UNIGBK结合之后的数据:%s",pname);
        /*原型声明:extern char *strcat(char *dest,char *src)
                头文件:#include <string.h>
                功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'')并添加''。
  说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
  返回指向dest的指针,返回值的类型为char*。*/       
       
        /*上面的两个函数放在一起实际上是将*pname指针所指向的的地址的数据变为0:/SYSTEM/FONT/UNIGBK.BIN
          以供下面的API函数使用。在API函数中0:/SYSTEM/FONT/UNIGBK.BIN就有具体的意义了。"0:"表示磁盘的
                种类,这里表示的是SD卡,/SYSTEM/FONT/UNIGBK.BIN表示文件路径。合在一起就表示SD卡中的文件路径。*/         
        res=f_open(fftemp,(const TCHAR*)pname,FA_READ);        
        if(res)rval|=1<<4;//打开文件失败
Psheng
2楼-- · 2019-07-20 12:12
 精彩回答 2  元偷偷看……

一周热门 更多>