如何把数组移到SD里然后用FATFS文件系统打开

 

对于FATFS文件系统来说如果要使他支持中文文件名,我们就必须要把cc936.c文件添加进我们的工程。而在cc936.c文件中的oem2uni和uni2oem数组又很大(总共占了15KB内存左右)。所以我们就会想可不可以把这两个数组放进SD卡里或者外部的flash呢,答案是肯定能行的,但要如何做呢,这就是我今天写的这个文档要记录的东西,此文档是把两个数组移进SD卡里,如果想移进flash可以看原子哥的教程。

首先准备的工具是一个能把txt文件转化为bin文件的工具,这里我使用的是原子哥的C2B转换助手 V1.1,准备好该工具后,先把uni2oem数组的内容复制出来,存到一个你建的txt文件内(名字你随便起,但不能含有中文否则你的移植将失败)我这里把该txt文件取名为uni2oem这样也能跟数组对应(好方便记忆)。建好文件和存入的内容如下图

如何把程序转到gpu运行 如何将程序转移到sd卡里_文件系统

(对于为什么只把数据移进txt文件而没有把 static const WCHAR uni2oem[] = {};放进去,看过原子哥教程的可能会有疑问,在这里我就说一下,如果我们在移数据时也把static const WCHAR uni2oem[] = {};添加进去那么有可能会发生灾难性的后果,为什么这么说,这是因为起先我也是这样移植的但用C2B转换助手转化后的数据是可怕的,因为这样做转换的时候老是出现数据的漏转换导致了我后前的二分查找法老是失败,起先我还怀疑是不是我的程序问题,但经过我一天一夜的测试我才发现是转换后的数据问题,对此我希望我的失败能给各位点经验,而把tatic const WCHAR uni2oem[] = {};去掉后在txt文件里只留下纯粹的十六进制的数据,用C2B转换助手 V1.1转换就没有漏丢的情况发生,所以我在txt文件内就只留下了数据)

对于oem2uni数组我们也照uni2oem的方法新建一个txt文件然后把纯粹的十六进制数据放进去。

这步做好后我们就开始转换数据了。打开转换助手选择文件,然后转化。我们把两个txt文件都转换后会在你当前的目录下生成两个bin文件,bin文件名也和你的txt文件名一样。而这两个文件也就是在SD读取的数据。

接着我们把cc936.c文件下的两个数组注释或者删除掉。

接着我们要做的事,就是改写cc936.c文件下的ff_convert函数的内容,改写后的内容如下:

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 */
 )
{
FIL fnew936; /* file objects */
FRESULT res936; 
UINT br936;               /* File R count */
WCHAR buffer936[2];          /* file copy buffer */
WCHAR c;
int i,n, li, hi;
if (src < 0x80) { /* ASCII */
c = src;
} else 
{
if (dir) 
{ /* OEMCP to unicode */ 
res936=f_open(&fnew936, "0:system/oem2uni.bin", FA_OPEN_EXISTING | FA_READ);  
if (res936==FR_OK) 
hi = fnew936.fsize/4 ;   //sizeof(oem2uni)=87174
} else 
{ /* Unicode to OEMCP */ 
res936=f_open(&fnew936, "0:system/uni2oem.bin", FA_OPEN_EXISTING | FA_READ);
if (res936==FR_OK) 
hi = fnew936.fsize/4 ; //sizeof(uni2oem)=87176
} 
if (res936==FR_OK)
{
li = 0;
for (n = 16; n; n--)
{
i=li+(hi-li)/2;
res936=f_lseek (&fnew936, i*4); 
res936=f_read(&fnew936,buffer936,sizeof(buffer936), &br936); 
if (src == buffer936[0]) break;
if (src > buffer936[0])
li = i;
else
hi = i; 
}
c = n ? buffer936[1] : 0;
}
else
c=0;
f_close(&fnew936);
}
return c;
}

res936=f_open(&fnew936, "0:system/oem2uni.bin", FA_OPEN_EXISTING | FA_READ);  函数的作用是打开我们存在SD里的oem2uni数组。(其中0:system/oem2uni.bin是这个oem2uni.bin文件在SD里的路径这里要根据你把oem2uni.bin存在那个路径下而修改)

自此我们就把cc936文件下的两个数组移到SD里了。

 

 

 

作者:勇攀高峰