Fatfs文件系统长文件名设置.docx
文本预览下载声明
“长文件名”“短文件名”的详细概念请自行去百度谷歌搜狗搜索。我们现在只需要知道一个文件名称长了,就是长文件名,例如sdjflasdjfas.txt;一个文件的名称短了,就是短文件名,例如a.txt。有人会问,文件名干嘛要分长短?这个问题属于计算机历史问题了。想深究,去百度吧。咱们先看看用“不支持长文件名”的文件系统和“支持长文件名”的文件系统分别读一个比较长的文件名显示的效果吧。?下面是“不支持长文件名”的文件系统读出来的:下面是“支持长文件名”的文件系统读出来的:很显然,文件系统如果不支持长文件名,岂能用哉?以FatFs为例,刚刚移植好的文件系统,默认是不支持长文件名的,要想支持长文件名,需要打开ffconf.h文件进行配置,找到_USE_LFN,把值从0改到1。如下图所示:改成1以后,任务还没有完成。为了能够支持中文,还需要把_CODE_PAGE的值改为936,如下图所示:这时候,你编译一下,系统会有如下错误产生:.\RationEB_Proj.axf: Error: L6218E: Undefined symbol ff_convert (referred from ff.o)..\RationEB_Proj.axf: Error: L6218E: Undefined symbol ff_wtoupper (referred from ff.o).Not enough information to list image symbols.Finished: 1 information, 0 warning and 2 error messages..\RationEB_Proj.axf - 2 Error(s), 0 Warning(s).提示,找不到ff_convert()和ff_wtoupper()这两个函数。?ff_convert()函数用来把Unicode和GBK之间进行转换。因为文件系统的文件名默认存储方式为Unicode编码,而我们编译器甚至是电脑,用的中文码为GBK。比如说,现在我要把一个文件名读出来显示到TFT上,当我们读完文件名以后,文件名实际上是由Unicode编码的,这时候,我们就需要找到这些Unicode码对应的GBK码,因为我们的字库是按照GBK编码的,所以需要用到ff_convert()函数里面的Unicode转GBK转换表来转换。由于中文有2万多个汉字,这张转换表实在是太大了,编译不通过,因为单片机容量太小了。所以我们把这张表格放到外部的FLASH吧。再比如说,我们要在SD卡上新建文件,我们给它的名字是由GBK编码的,而文件名存储,必须是Unicode才行,这时候就需要用到GBK转Unicode的表格。这张表同样很大,所以我们把这张表也放到外部的FLASH里面。?ff_wtoupper()函数是用来英文大小写转换的,比如说,我们把文件名写为ABC.TXT,我们读abc.txt同样会读到这个文件。就是这个文件起的作用。?这两个函数,位于cc936.c文件中,所以我们要把这个文件添加到工程中,cc936.c文件位了FatFs源码的option文件夹当中。添加好后的工程如下所示:打开cc936.c文件,ff_wtoupper()文件不用修改。把ff_convert()函数里面的U2G和G2U两张表格数据删除,把函数修改为读取外部的FLASH,来进行U2G和G2U的转换。修改后的函数为:WCHAR ff_convert ( /* Converted code, 0 means conversion error */WCHAR src, /* Character code to be converted */UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */){ WCHAR c; uint32_t offset; // W25X16地址便宜 uint8_t GBKH,GBKL; // GBK码高位与低位 uint8_t unigbk[2]; // uint8_t gbkuni[2]; // if (src 0x80) /* ASCII */ { c = src; } else { if(dir == 0) /* Unicode to GBK */ { if( (src 0x4DFF) (src 0x9FA6) ) { offset = ((((uint32_t)src - 0x4E00) * 2) + 0x0C0000); W25Q16_Read(unigbk,offset,2); c = (((uint16_t)unigbk[
显示全部