Fatfs文件系統(tǒng)長文件名設(shè)置_第1頁
Fatfs文件系統(tǒng)長文件名設(shè)置_第2頁
Fatfs文件系統(tǒng)長文件名設(shè)置_第3頁
Fatfs文件系統(tǒng)長文件名設(shè)置_第4頁
Fatfs文件系統(tǒng)長文件名設(shè)置_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、“長文件名”“短文件名”的詳細(xì)概念請自行去百度谷歌搜狗搜索。我們現(xiàn)在只需要知道一個(gè)文件名稱長了,就是長文件名,例如sdjflasdjfas.txt;一個(gè)文件的名稱短了,就是短文件名,例如a.txt。有人會問,文件名干嘛要分長短?這個(gè)問題屬于計(jì)算機(jī)歷史問題了。想深究,去百度吧。咱們先看看用“不支持長文件名”的文件系統(tǒng)和“支持長文件名”的文件系統(tǒng)分別讀一個(gè)比較長的文件名顯示的效果吧。 下面是“不支持長文件名”的文件系統(tǒng)讀出來的:下面是“支持長文件名”的文件系統(tǒng)讀出來的:很顯然,文件系統(tǒng)如果不支持長文件名,豈能用哉?以FatFs為例,剛剛移植好的文件系統(tǒng),默認(rèn)是不支持長文件名的,要想支持長

2、文件名,需要打開ffconf.h文件進(jìn)行配置,找到_USE_LFN,把值從0改到1。如下圖所示:改成1以后,任務(wù)還沒有完成。為了能夠支持中文,還需要把_CODE_PAGE的值改為936,如下圖所示:這時(shí)候,你編譯一下,系統(tǒng)會有如下錯(cuò)誤產(chǎn)生:.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 i

3、nformation 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()這兩個(gè)函數(shù)。 ff_convert()函數(shù)用來把Unicode和GBK之間進(jìn)行轉(zhuǎn)換。因?yàn)槲募到y(tǒng)的文件名默認(rèn)存儲方式為Unicode編碼,而我們編譯器甚至是電腦,用的中文碼為GBK。比如說,現(xiàn)在我要把一個(gè)文件名讀出來顯示到TFT上,

4、當(dāng)我們讀完文件名以后,文件名實(shí)際上是由Unicode編碼的,這時(shí)候,我們就需要找到這些Unicode碼對應(yīng)的GBK碼,因?yàn)槲覀兊淖謳焓前凑誈BK編碼的,所以需要用到ff_convert()函數(shù)里面的Unicode轉(zhuǎn)GBK轉(zhuǎn)換表來轉(zhuǎn)換。由于中文有2萬多個(gè)漢字,這張轉(zhuǎn)換表實(shí)在是太大了,編譯不通過,因?yàn)閱纹瑱C(jī)容量太小了。所以我們把這張表格放到外部的FLASH吧。再比如說,我們要在SD卡上新建文件,我們給它的名字是由GBK編碼的,而文件名存儲,必須是Unicode才行,這時(shí)候就需要用到GBK轉(zhuǎn)Unicode的表格。這張表同樣很大,所以我們把這張表也放到外部的FLASH里面。 ff_wtoup

5、per()函數(shù)是用來英文大小寫轉(zhuǎn)換的,比如說,我們把文件名寫為ABC.TXT,我們讀abc.txt同樣會讀到這個(gè)文件。就是這個(gè)文件起的作用。 這兩個(gè)函數(shù),位于cc936.c文件中,所以我們要把這個(gè)文件添加到工程中,cc936.c文件位了FatFs源碼的option文件夾當(dāng)中。添加好后的工程如下所示:打開cc936.c文件,ff_wtoupper()文件不用修改。把ff_convert()函數(shù)里面的U2G和G2U兩張表格數(shù)據(jù)刪除,把函數(shù)修改為讀取外部的FLASH,來進(jìn)行U2G和G2U的轉(zhuǎn)換。修改后的函數(shù)為:WCHAR ff_convert ( /* Converted code, 0

6、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 < 0x80) /* ASCII */ c = src; else if(dir = 0) /* Uni

7、code to GBK */ if( (src > 0x4DFF) && (src < 0x9FA6) ) offset = (uint32_t)src - 0x4E00) * 2) + 0x0C0000); W25Q16_Read(unigbk,offset,2); c = (uint16_t)unigbk0)<<8)+(uint16_t)unigbk1; else c = 0xA1A1; /如果是其它符號,都用NULL代替 else if(dir = 1) /* GBK to Unicode */ GBKH=(uint8_t)(src>>

8、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)gbkuni1)<<8)+(uint16_t)gbkuni0; return c;兩張大表放到外部flash,這里就精簡很多了吧。不過,這時(shí)候,還是有一些中文符號無法顯示,例如常用的書名號,中文頓號、,中文雙引號 單引號,中文括號【】等都不能顯示。這時(shí)候,我們可以手動添加進(jìn)去讓其顯示,如下:WCHAR ff_co

9、nvert ( /* 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 < 0x80) /* ASCII */ c =

10、 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;br

11、eak; / 支持符號: 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; / 支持符

12、號: 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) +

13、0x0C0000); W25Q16_Read(unigbk,offset,2); c = (uint16_t)unigbk0)<<8)+(uint16_t)unigbk1; 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 = (ui

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論