1、“长文件名”“短文件名”的详细概念请自行去百度谷歌搜狗搜索。我们现在只需要知道一个文件名称长了,就是长文件名,例如sdjflasdjfas.txt;一个文件的名称短了,就是短文件名,例如 a.txt。有人会问,文件名干嘛要分长短?这个问题属于计算机历史问题了。想深究,去百度吧。咱们先看看用“不支持长文件名”的文件系统和“支持长文件名”的文件系统分别读一个比较长的文件名显示的效果吧。下面是“不支持长文件名”的文件系统读出来的:下面是“支持长文件名”的文件系统读出来的:很显然,文件系统如果不支持长文件名,岂能用哉?以 FatFs 为例,刚刚移植好的文件系统,默认是不支持长文件名的,要想支持长文件名
2、,需要打开 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 eno
3、ugh 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 上,当
4、我们读完文件名以后,文件名实际上是由 Unicode 编码的,这时候,我们就需要找到这些 Unicode 码对应的 GBK 码,因为我们的字库是按照 GBK 编码的,所以需要用到ff_convert()函数里面的 Unicode 转 GBK 转换表来转换。由于中文有 2 万多个汉字,这张转换表实在是太大了,编译不通过,因为单片机容量太小了。所以我们把这张表格放到外部的 FLASH 吧。再比如说,我们要在 SD 卡上新建文件,我们给它的名字是由 GBK 编码的,而文件名存储,必须是 Unicode 才行,这时候就需要用到 GBK 转 Unicode 的表格。这张表同样很大,所以我们把这张表也放到
5、外部的 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
6、 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 unigbk2; / uint8_t gbkuni2; / if (src 0x4DFF) GBKL=(uint8_t)
7、(src); GBKH-=0x81;GBKL-=0x40;offset=(uint32_t)192*GBKH+GBKL)*2;W25Q16_Read(gbkuni,offset+0x0D0000,2); c = (uint16_t)gbkuni1) 0x4DFF) GBKL=(uint8_t)(src); GBKH-=0x81;GBKL-=0x40;offset=(uint32_t)192*GBKH+GBKL)*2;W25Q16_Read(gbkuni,offset+0x0D0000,2); c = (uint16_t)gbkuni1)8)+(uint16_t)gbkuni0;return c;如果你还想支持其他一下特殊符号,可以利用 Unicode 码和 GBK 码转换软件自行添加。想看该例程源文件。可以下载瑞生 LPC1114 V3.0 开发板资料,位于应用篇例程6。我是瑞生,毫无保留的给大家透露电子设计经验,不定时分享实用的落地的电子设计技巧,希望能够帮助到大家。 不想错过精彩点滴分享,请关注我吧!