OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5462|回复: 7

问大家一个FATFS文件名的问题

[复制链接]

10

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2012-11-11
在线时间
3 小时
发表于 2014-3-4 11:54:23 | 显示全部楼层 |阅读模式
FATFS版本是0.09.
如果定义:
_USE_LFN=0
_LFN_UNICODE=0
打开一个文件
res=f_open(&fil, “你好.TXT”, FA_READ|FA_OPEN_EXISTING);
编译正确并正常运行。

但是如果
_USE_LFN=2
_LFN_UNICODE=1
res=f_open(&fil, “你好.TXT”, FA_READ|FA_OPEN_EXISTING);
编译器提示 error:  #167: argument of type "char *" is incompatible with parameter of type "const TCHAR *"
我查看了TCHAR在使用长文件名时的定义(在不使用长文件名时是char型),是short型的。但是“你好.TXT”传递的是char型的指针。


难道我必须每次直接打开一个指定名字的文件 都要对文件名字转换成unicode才行吗?







正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-3-4 12:47:08 | 显示全部楼层
回复 支持 反对

使用道具 举报

10

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2012-11-11
在线时间
3 小时
 楼主| 发表于 2014-3-4 12:47:44 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
老师 你知道这个问题该怎么办吗?
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-3-4 12:59:14 | 显示全部楼层
回复【3楼】xiaozhuqing1:
---------------------------------
fatfs后面不是都说的很明白了么?翻译以下就可以了,中文的要添加相关的字库文件的
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

10

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2012-11-11
在线时间
3 小时
 楼主| 发表于 2014-3-4 13:16:40 | 显示全部楼层
回复【4楼】Badu_Space:
---------------------------------
我知道啊。添加CC936.c文件。 现在不是这个问题呢。
比如SD卡里有一个名称为1234567890.txt的长文件名文件。
该如何用f_open打开这个文件呢?
char *name="1234567890.txt";
TCHAR *unicode_name=char_to_Unicode(name);

是f_open(&fil, name, FA_READ|FA_OPEN_EXISTING);
还是f_open(&fil, unicode_name, FA_READ|FA_OPEN_EXISTING);?
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-3-4 13:21:03 | 显示全部楼层
回复【5楼】xiaozhuqing1:
---------------------------------
两个都试下,看下哪个正确???汗,这种直接实验就好啦
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

10

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2012-11-11
在线时间
3 小时
 楼主| 发表于 2014-3-4 13:42:34 | 显示全部楼层
回复【6楼】Badu_Space:
---------------------------------
我已经试验过了。 如果在短文件名模式下,第一个正确,第二个错误。
如果在长文件名模式下,第一个错误,第二个正确。

如果想直接打开一个长文件名的话,可以这样写
f_open(&fil, L“1234567890.txt”, FA_READ|FA_OPEN_EXISTING);
或者
f_open(&fil, L“这是一个示例文本.txt”, FA_READ|FA_OPEN_EXISTING);

就是在文件名前加个L,告诉编译器,现在字符型占用两个字节,汉字也占用两个字节(应该就是UNICODE编码)。
在调用了f_open后,程序执行过程中会调用:
WCHAR ff_convert ( /* Converted code, 0 means conversion error */
WCHAR src, /* Character code to be converted */
UINT dir
)这个函数,把文件名转换成GBK格式。
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-3-4 13:46:17 | 显示全部楼层
回复【7楼】xiaozhuqing1:
---------------------------------
这就对了嘛,有时候自己动手之后还比较好理解,恭喜

不过平常要求速度和所占用的资源比较少的情况下还是用短文件名比较好点,尤其是带中文长文件名的应用,还要用到内存管理函数
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-14 03:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表