如何设置FatFs文件系统支持长文件名
“长文件名”“短文件名”的详细概念请自行去百度谷歌搜狗搜索。
我们现在只需要知道一个文件名称长了,就是长文件名,例如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文件系统支持长文件名相关推荐
- fatfs文件系统支持中文长文件名
一.引出 Fatfs文件系统中存在短文件名和长文件名的概念.当文件名的字符长度短于13个字符时,称为短文件名.当长于13个字符则称为长文件名. 如果不配置Fatfs文件系统的长文件名功能,当遇到短于1 ...
- STM32CubeMX配置SD卡+DMA+Fatfs文件系统
STM32CubeMX配置SD卡+DMA+Fatfs文件系统 一.设备及软件 1.keil 2.STM32CubeMX 3.正点原子STM32F407探索者开发板 二.配置步骤 1.配置RCC外部晶振 ...
- 配置 FATFS 支持长文件名
FATFS 版本:Nov 09 14 R0.10c 在 FATFS 已经移植好的基础上,首先打开 ffconf.h 配置文件,找到如下图配置项: 可以将此值从 0 改为 1 使用 static wor ...
- FATFS文件系统的中文长文件名配置的几个注意事项
今天终于把FATFS文件系统的中文长文件名弄个端倪出来了.可以在串口输出根目录甚至是二级目录下的文件,虽然还是有些小问题需要进一步调试. 第一步,当然是下载,这个很容易,下载到最新的FF0.9a就行. ...
- FATFS文件系统框架及源码分析
FATFS是一个为小型嵌入式系统设计的通用FAT(File Allocation Table)文件系统模块.FatFs 的编写遵循ANSI C,并且完全与磁盘I/O层分开.因此,它独立(不依赖)于硬件 ...
- 基于SD卡的FatFs文件系统(FatFs移植到STM32)
平台:STM32ZET6(核心板)+ST-LINK/V2+SD卡+USB串口线 工程介绍:主要文件在USER组中,bsp_sdio_sdcard.c,bsp_sdio_sdcard.h和main.c, ...
- STM32CubeMX学习笔记(25)——FatFs文件系统使用(操作SPI Flash)
一.FatFs简介 FatFs 是面向小型嵌入式系统的一种通用的 FAT 文件系统.它完全是由 ANSI C 语言编写并且完全独立于底层的 I/O 介质.因此它可以很容易地不加修改地移植到其他的处理器 ...
- 2021-08-11 TM32F103 Buffer FatFs 文件系统移植
FatFs 本文展示了STM32 FatFs文件系统移植 内容涉及 : FatFs 文件系统移植 SPI函数移植过程 SPI字节数据模拟输出独写 缓存读写 USART串口的识别 IO口输入输出 按键的 ...
- STM32+雷龙SD NAND(贴片SD卡)完成FATFS文件系统移植与测试
一.前言 在STM32项目开发中,经常会用到存储芯片存储数据. 比如:关机时保存机器运行过程中的状态数据,上电再从存储芯片里读取数据恢复:在存储芯片里也会存放很多资源文件.比如,开机音乐,界面上的菜单 ...
最新文章
- 方法的运用_企业如何运用论坛做营销,千享科技分享技巧方法
- Site Group Level Price Maintenance in IS Retail
- NLPIR-KGB知识图谱引擎突破传统数据挖掘束缚
- 为什么(2.55).toFixed(1)等于2.5?
- 如何使用robots禁止各大搜索引擎爬虫爬取网站
- Oracle 建立包 和 包体
- 使用Marshal.Copy把Txt行数据转为Struct类型值
- 闲鱼对Flutter-Native混合工程解耦的探索
- read 和write
- pc控制iphone的软件_iPhone照片视频传输及HEIC照片转档
- 高德地图提前上线多条重要道路预通车机制不断成熟
- (转)Java 之 FileReader FileInputStream InputStreamReader BufferedReader 作用与区别
- 在App内跳转微信,打开微信
- 高仿英雄联盟游戏网页制作作业 英雄联盟LOL游戏HTML网页设计模板 简单学生网页设计 静态HTML CSS网站制作成品
- .vdat文件怎么打开
- Android Manifest
- oracle数据库基础知识总结,我见过的最值得收藏的Oracle数据库知识点总结(III)...
- 【科研思考】如何做学术研究?—— 我的方法论
- dfinity入门——dfx常用指令与motoko基本语法
- Android开发系列之XML解析