我使用了FATFS文件系统操作SD卡,因为需要使用中文,所以用到了CC936.c这个文件,但是这个文件下两个数组很大,很占用单片机ROM,所以我想把它移出来,原子哥用的方法是放到外部存储器里面,但是现在我这边没有外接的存储器,所以想直接使用SD卡作为外部存储器,我觉得都是操作外部存储器,所以原理应该是相同的。但是我现在按照原子哥步骤读取数据,会出错。代码如下:
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 t[2];
WCHAR c;
u32 i, li, hi;
u16 n;
u32 gbk2uni_offset = 0;
u32 size = 0;
u8 Temp = 0;
FIL * fftemp;
u8 *tempbuf;
u32 bread = 0;
if (src < 0x80)
{
c = src;//ASCII,直接不用转换
}
else
{
fftemp = (FIL*)mymalloc(SRAMIN,sizeof(FIL)); //分配内存
tempbuf = mymalloc(SRAMIN,4); //分配4个字节空间
Temp = f_open(fftemp,(const TCHAR*)"0:/System/UNIGBK.BIN",FA_READ);//打开路径下的文件
if(Temp == FR_OK)
{
size = f_size(fftemp); //获得文件大小
if(dir)
{
gbk2uni_offset = size / 2;
}
else
{
gbk2uni_offset = 0;
}
hi = size / 2;//对半开.
hi = hi / 4 - 1;
li = 0;
for (n = 16; n; n--)
{
i = li + (hi - li) / 2;
f_lseek(fftemp,i * 4 + gbk2uni_offset); //根据地址偏移指针
f_read(fftemp,tempbuf,4,(UINT *)&bread); //读取数据
t[0] = *tempbuf;
t[0] <<= 8; //数据合成
t[0] |= *(tempbuf + 1);
t[1] = *(tempbuf + 2);
t[1] <<= 8;
t[1] |= *(tempbuf + 3);
if (src == t[0]) break;
if (src > t[0])li = i;
else hi = i;
}
c = n ? t[1] : 0;
f_close(fftemp); //关闭文件
myfree(SRAMIN,fftemp); //释放内存
myfree(SRAMIN,tempbuf); //释放内存
}
}
return c;
}
下面是我调用的函数
Temp = mf_mkdir("0:/传感器数据"); //建立路径
但是这条语句没有成功
而且,我在反复实验时,最后那三条语句:释放内存 去掉,路径是可以创建的,但是中文名称不对,TXT文本的 中文是完全正确的。
我很奇怪,英文是没问题的,但是中文路径和 TXT文本中的中文内容,不是一样的创建原理?
还希望有过调试经验的前辈,不惜赐教一下,谢谢了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>