“长文件名”“短文件名”的详细概念请自行去百度谷歌搜狗搜索。

我们现在只需要知道一个文件名称长了,就是长文件名,例如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[0])<<8)+(uint16_t)unigbk[1]; }else c = 0xA1A1; //如果是其它符号,都用NULL代替}else if(dir == 1) /* GBK to Unicode */{GBKH=(uint8_t)(src>>8); GBKL=(uint8_t)(src); GBKH-=0x81;GBKL-=0x40;offset=((uint32_t)192*GBKH+GBKL)*2;W25Q16_Read(gbkuni,offset+0x0D0000,2); c = (((uint16_t)gbkuni[1])<<8)+(uint16_t)gbkuni[0];}}return c;
}

两张大表放到外部flash,这里就精简很多了吧。

不过,这时候,还是有一些中文符号无法显示,例如常用的书名号《》,中文顿号、,中文双引号 单引号,中文括号【】等都不能显示。这时候,我们可以手动添加进去让其显示,如下:

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 */{switch(src){case 0x3001: c = 0xA1A2;break;       // 支持符号: 、 中文顿号case 0x300A: c = 0xA1B6;break;     // 支持符号:《case 0x300B: c = 0xA1B7;break;       //  支持符号:》case 0x201C: c = 0xA1B0;break;    // 支持符号: “    中文左双引号case 0x201D: c = 0xA1B1;break;     // 支持符号:”   中文右双引号case 0x2606: c = 0xA1EE;break;     //  支持符号:☆case 0x2605: c = 0xA1EF;break;    // 支持符号: ★case 0x2018: c = 0xA1AE;break;     // 支持符号:‘ 中文左单引号case 0x2019: c = 0xA1AF;break;     //  支持符号:’中文右单引号case 0x3010: c = 0xA1BE;break;      // 支持符号: 【case 0x3011: c = 0xA1BF;break;     // 支持符号: 】case 0x3016: c = 0xA1BC;break;       //  支持符号:〖case 0x3017: c = 0xA1BD;break;    // 支持符号: 〗case 0x2299: c = 0xA1D1;break;     // 支持符号:⊙case 0x2116: c = 0xA1ED;break;        //  支持符号:№case 0x2236: c = 0xA1C3;break;    // 支持符号: ∶case 0x203B: c = 0xA1F9;break;     // 支持符号:※case 0x221E: c = 0xA1DE;break;        //  支持符号:∞default:if( (src > 0x4DFF) && (src < 0x9FA6) ){offset = ((((uint32_t)src - 0x4E00) * 2) + 0x0C0000); W25Q16_Read(unigbk,offset,2); c = (((uint16_t)unigbk[0])<<8)+(uint16_t)unigbk[1]; }else c = 0xA1A1; //如果是其它符号,都用NULL代替break;}else if(dir == 1) /* GBK to Unicode */{GBKH=(uint8_t)(src>>8); GBKL=(uint8_t)(src); GBKH-=0x81;GBKL-=0x40;offset=((uint32_t)192*GBKH+GBKL)*2;W25Q16_Read(gbkuni,offset+0x0D0000,2); c = (((uint16_t)gbkuni[1])<<8)+(uint16_t)gbkuni[0];}}return c;
}

如果你还想支持其他一下特殊符号,可以利用Unicode码和GBK码转换软件自行添加。

想看该例程源文件。可以下载瑞生LPC1114 V3.0开发板资料,位于应用篇例程6。

如何设置FatFs文件系统支持长文件名_eagle11235的博客-CSDN博客
https://blog.csdn.net/eagle11235/article/details/52606089

如何设置FatFs文件系统支持长文件名相关推荐

  1. fatfs文件系统支持中文长文件名

    一.引出 Fatfs文件系统中存在短文件名和长文件名的概念.当文件名的字符长度短于13个字符时,称为短文件名.当长于13个字符则称为长文件名. 如果不配置Fatfs文件系统的长文件名功能,当遇到短于1 ...

  2. STM32CubeMX配置SD卡+DMA+Fatfs文件系统

    STM32CubeMX配置SD卡+DMA+Fatfs文件系统 一.设备及软件 1.keil 2.STM32CubeMX 3.正点原子STM32F407探索者开发板 二.配置步骤 1.配置RCC外部晶振 ...

  3. 配置 FATFS 支持长文件名

    FATFS 版本:Nov 09 14 R0.10c 在 FATFS 已经移植好的基础上,首先打开 ffconf.h 配置文件,找到如下图配置项: 可以将此值从 0 改为 1 使用 static wor ...

  4. FATFS文件系统的中文长文件名配置的几个注意事项

    今天终于把FATFS文件系统的中文长文件名弄个端倪出来了.可以在串口输出根目录甚至是二级目录下的文件,虽然还是有些小问题需要进一步调试. 第一步,当然是下载,这个很容易,下载到最新的FF0.9a就行. ...

  5. FATFS文件系统框架及源码分析

    FATFS是一个为小型嵌入式系统设计的通用FAT(File Allocation Table)文件系统模块.FatFs 的编写遵循ANSI C,并且完全与磁盘I/O层分开.因此,它独立(不依赖)于硬件 ...

  6. 基于SD卡的FatFs文件系统(FatFs移植到STM32)

    平台:STM32ZET6(核心板)+ST-LINK/V2+SD卡+USB串口线 工程介绍:主要文件在USER组中,bsp_sdio_sdcard.c,bsp_sdio_sdcard.h和main.c, ...

  7. STM32CubeMX学习笔记(25)——FatFs文件系统使用(操作SPI Flash)

    一.FatFs简介 FatFs 是面向小型嵌入式系统的一种通用的 FAT 文件系统.它完全是由 ANSI C 语言编写并且完全独立于底层的 I/O 介质.因此它可以很容易地不加修改地移植到其他的处理器 ...

  8. 2021-08-11 TM32F103 Buffer FatFs 文件系统移植

    FatFs 本文展示了STM32 FatFs文件系统移植 内容涉及 : FatFs 文件系统移植 SPI函数移植过程 SPI字节数据模拟输出独写 缓存读写 USART串口的识别 IO口输入输出 按键的 ...

  9. STM32+雷龙SD NAND(贴片SD卡)完成FATFS文件系统移植与测试

    一.前言 在STM32项目开发中,经常会用到存储芯片存储数据. 比如:关机时保存机器运行过程中的状态数据,上电再从存储芯片里读取数据恢复:在存储芯片里也会存放很多资源文件.比如,开机音乐,界面上的菜单 ...

最新文章

  1. 方法的运用_企业如何运用论坛做营销,千享科技分享技巧方法
  2. Site Group Level Price Maintenance in IS Retail
  3. NLPIR-KGB知识图谱引擎突破传统数据挖掘束缚
  4. 为什么(2.55).toFixed(1)等于2.5?
  5. 如何使用robots禁止各大搜索引擎爬虫爬取网站
  6. Oracle 建立包 和 包体
  7. 使用Marshal.Copy把Txt行数据转为Struct类型值
  8. 闲鱼对Flutter-Native混合工程解耦的探索
  9. read 和write
  10. pc控制iphone的软件_iPhone照片视频传输及HEIC照片转档
  11. 高德地图提前上线多条重要道路预通车机制不断成熟
  12. (转)Java 之 FileReader FileInputStream InputStreamReader BufferedReader 作用与区别
  13. 在App内跳转微信,打开微信
  14. 高仿英雄联盟游戏网页制作作业 英雄联盟LOL游戏HTML网页设计模板 简单学生网页设计 静态HTML CSS网站制作成品
  15. .vdat文件怎么打开
  16. Android Manifest
  17. oracle数据库基础知识总结,我见过的最值得收藏的Oracle数据库知识点总结(III)...
  18. 【科研思考】如何做学术研究?—— 我的方法论
  19. dfinity入门——dfx常用指令与motoko基本语法
  20. Android开发系列之XML解析

热门文章

  1. 2017云栖跑为信仰而战,炫酷体验享你所享
  2. 看漫画就能学Python | 要是我入门Python的时候有这份资料就好了
  3. 如何用公式编辑器打倒问号?
  4. 用邻接表存储图c语言,邻接表、邻接多重表、十字链表及C语言实现
  5. IDEA设计网页设计浏览器
  6. Redis应用场景举例
  7. 20172266遥感一班李安娜第三次笔记
  8. Gover算法的简单解释
  9. 使用Struts的论坛系统的设计与实现
  10. 六、约束(主键约束、唯一约束、非空约束、检查约束、外键约束)