Fatfs文件系统长文件名设置

Fatfs文件系统长文件名设置

ID:47428804

大小:459.89 KB

页数:8页

时间:2020-01-11

Fatfs文件系统长文件名设置_第页
预览图正在加载中,预计需要20秒,请耐心等待
资源描述:

《Fatfs文件系统长文件名设置》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、“长文件名”“短文件名”的详细概念请自行去百度谷歌搜狗搜索。我们现在只需要知道一个文件名称长了,就是长文件名,例如sdjflasdjfas.txt;一个文件的名称短了,就是短文件名,例如a.txt。有人会问,文件名干嘛要分长短?这个问题属于计算机历史问题了。想深究,去百度吧。咱们先看看用“不支持长文件名”的文件系统和“支持长文件名”的文件系统分别读一个比较长的文件名显示的效果吧。 下面是“不支持长文件名”的文件系统读出来的:下面是“支持长文件名”的文件系统读出来的:很显然,文件系统如果不支持长文件名,岂能用哉?以Fat

2、Fs为例,刚刚移植好的文件系统,默认是不支持长文件名的,要想支持长文件名,需要打开ffconf.h文件进行配置,找到_USE_LFN,把值从0改到1。如下图所示:改成1以后,任务还没有完成。为了能够支持中文,还需要把_CODE_PAGE的值改为936,如下图所示:这时候,你编译一下,系统会有如下错误产生:.RationEB_Proj.axf:Error:L6218E:Undefinedsymbolff_convert(referredfromff.o)..RationEB_Proj.axf:Error:L6218E

3、:Undefinedsymbolff_wtoupper(referredfromff.o).Notenoughinformationtolistimagesymbols.Finished:1information,0warningand2errormessages.".RationEB_Proj.axf"-2Error(s),0Warning(s).提示,找不到ff_convert()和ff_wtoupper()这两个函数。 ff_convert()函数用来把Unicode和GBK之间进行转换。因为文件系统的文件名默

4、认存储方式为Unicode编码,而我们编译器甚至是电脑,用的中文码为GBK。比如说,现在我要把一个文件名读出来显示到TFT上,当我们读完文件名以后,文件名实际上是由Unicode编码的,这时候,我们就需要找到这些Unicode码对应的GBK码,因为我们的字库是按照GBK编码的,所以需要用到ff_convert()函数里面的Unicode转GBK转换表来转换。由于中文有2万多个汉字,这张转换表实在是太大了,编译不通过,因为单片机容量太小了。所以我们把这张表格放到外部的FLASH吧。再比如说,我们要在SD卡上新建文件,我们

5、给它的名字是由GBK编码的,而文件名存储,必须是Unicode才行,这时候就需要用到GBK转Unicode的表格。这张表同样很大,所以我们把这张表也放到外部的FLASH里面。 ff_wtoupper()函数是用来英文大小写转换的,比如说,我们把文件名写为ABC.TXT,我们读abc.txt同样会读到这个文件。就是这个文件起的作用。 这两个函数,位于cc936.c文件中,所以我们要把这个文件添加到工程中,cc936.c文件位了FatFs源码的option文件夹当中。添加好后的工程如下所示:打开cc936.c文件,ff_w

6、toupper()文件不用修改。把ff_convert()函数里面的U2G和G2U两张表格数据删除,把函数修改为读取外部的FLASH,来进行U2G和G2U的转换。修改后的函数为:WCHARff_convert(/*Convertedcode,0meansconversionerror*/WCHARsrc,/*Charactercodetobeconverted*/UINTdir/*0:UnicodetoOEMCP,1:OEMCPtoUnicode*/){WCHARc;uint32_toffset;//W25X16地址便

7、宜uint8_tGBKH,GBKL;//GBK码高位与低位uint8_tunigbk[2];//uint8_tgbkuni[2];//if(src<0x80)/*ASCII*/{c=src;}else{if(dir==0)/*UnicodetoGBK*/{if((src>0x4DFF)&&(src<0x9FA6)){offset=((((uint32_t)src-0x4E00)*2)+0x0C0000);W25Q16_Read(unigbk,offset,2);c=(((uint16_t)unigbk[0])<<8)+

8、(uint16_t)unigbk[1];}elsec=0xA1A1;//如果是其它符号,都用NULL代替}elseif(dir==1)/*GBKtoUnicode*/{GBKH=(uint8_t)(src>>8);GBKL=(uint8_t)(src);GBKH-=0x81;GBKL-=0x40;offset=((uint32_t

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。