OpenEdv-开源电子网

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

FatFs文件中文支持移植出现FR_INVALID_NAME错误问题

[复制链接]

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2019-5-5
在线时间
16 小时
发表于 2019-7-17 15:56:06 | 显示全部楼层 |阅读模式
5金钱
在FatFs文件系统移植后,为了添加对中文的支持,我这里用的是R0.13c最新版的版本。首先更改文件ffconf.h,宏定义FF_USE_LFN修改为3,其实这里更改为1也可以,如果修改为3的话,需要实现ffsystem.c文件中ff_memalloc()和ff_memfree()两个函数。然后宏定义FF_CODE_PAGE修改为936。按理说,到了这一步,应该没有什么问题了。编译也成功通过。main中代码如下:
  1. SDcard_Memory = (FATFS*)mymalloc(SRAMIN,sizeof(FATFS));

  2.         //挂载SD卡
  3.         res = f_mount(SDcard_Memory,"0:",1);
  4.         LCD_ShowString(50,190,400,30,24,"SD Card is ready!");

  5.         res = f_open(&file_1,"0:中文测试.txt",FA_CREATE_ALWAYS|FA_READ|FA_WRITE);
  6.         if(res)
  7.         {
  8.                 LCD_ShowNum(350,220,res,2,24);
  9.                 LCD_ShowString(50,220,400,30,24,"File Open Failed");
  10.         }
  11.         res = f_write(&file_1,str,sizeof(str),&bw);
  12.         if(res)
  13.         {
  14.                 LCD_ShowNum(350,250,res,2,24);
  15.                 LCD_ShowString(50,250,400,30,24,"File Write Failed");
  16.         }
  17.         f_lseek(&file_1,0);
  18.         res = f_read(&file_1,buff,sizeof(str),&br);
  19.         if(res)
  20.         {
  21.                 LCD_ShowNum(350,280,res,2,24);
  22.                 LCD_ShowString(50,280,400,30,24,"File Read Failed");
  23.         }
  24.         LCD_ShowString(50,310,400,30,24,buff);

  25.         f_close(&file_1);

  26.         Scan_files("0:",fl,&cnt);
  27.         for(i=0;i<cnt;i++)
  28.         {
  29.                 LCD_ShowNum(350,310,cnt,3,24);
  30.                 LCD_ShowString(50,340+i*20,400,20,16,fl[i].fname);
  31.         }
复制代码
执行结果,第一个返回错误6,也就是FR_INVALID_NAME。后面两个返回9。
调试1:
       f_open(&file_1,"0:测试.txt",FA_CREATE_ALWAYS|FA_READ|FA_WRITE);  这个没有问题,成功执行。
调试2:
       f_open(&file_1,"0:测试中.txt",FA_CREATE_ALWAYS|FA_READ|FA_WRITE);出现错误6,不行
调试3:
       f_open(&file_1,"0:测试1234567890.txt",FA_CREATE_ALWAYS|FA_READ|FA_WRITE);这个也没有问题,成功执行


这里呢,"0:测试.txt"显示大小是char[13],而fname[FF_LFN_BUF + 1 ]中的FF_LFN_BUF+1正好也是13,这是不是巧合。为什么多添加一个汉字都不行。而在后面添加数字或者字母却是可以的。


然后,把SD卡拆下来,拿到电脑上查看,文件确实有,但是显示乱码。


ffconf.h文件部分代码如下:
  1. /*---------------------------------------------------------------------------/
  2. / Locale and Namespace Configurations
  3. /---------------------------------------------------------------------------*/

  4. #define FF_CODE_PAGE        936
  5. /* This option specifies the OEM code page to be used on the target system.
  6. /  Incorrect code page setting can cause a file open failure.
  7. /
  8. /   437 - U.S.
  9. /   720 - Arabic
  10. /   737 - Greek
  11. /   771 - KBL
  12. /   775 - Baltic
  13. /   850 - Latin 1
  14. /   852 - Latin 2
  15. /   855 - Cyrillic
  16. /   857 - Turkish
  17. /   860 - Portuguese
  18. /   861 - Icelandic
  19. /   862 - Hebrew
  20. /   863 - Canadian French
  21. /   864 - Arabic
  22. /   865 - Nordic
  23. /   866 - Russian
  24. /   869 - Greek 2
  25. /   932 - Japanese (DBCS)
  26. /   936 - Simplified Chinese (DBCS)
  27. /   949 - Korean (DBCS)
  28. /   950 - Traditional Chinese (DBCS)
  29. /     0 - Include all code pages above and configured by f_setcp()
  30. */


  31. #define FF_USE_LFN                3
  32. #define FF_MAX_LFN                255
  33. /* The FF_USE_LFN switches the support for LFN (long file name).
  34. /
  35. /   0: Disable LFN. FF_MAX_LFN has no effect.
  36. /   1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe.
  37. /   2: Enable LFN with dynamic working buffer on the STACK.
  38. /   3: Enable LFN with dynamic working buffer on the HEAP.
  39. /
  40. /  To enable the LFN, ffunicode.c needs to be added to the project. The LFN function
  41. /  requiers certain internal working buffer occupies (FF_MAX_LFN + 1) * 2 bytes and
  42. /  additional (FF_MAX_LFN + 44) / 15 * 32 bytes when exFAT is enabled.
  43. /  The FF_MAX_LFN defines size of the working buffer in UTF-16 code unit and it can
  44. /  be in range of 12 to 255. It is recommended to be set 255 to fully support LFN
  45. /  specification.
  46. /  When use stack for the working buffer, take care on stack overflow. When use heap
  47. /  memory for the working buffer, memory management functions, ff_memalloc() and
  48. /  ff_memfree() in ffsystem.c, need to be added to the project. */


  49. #define FF_LFN_UNICODE        0
  50. /* This option switches the character encoding on the API when LFN is enabled.
  51. /
  52. /   0: ANSI/OEM in current CP (TCHAR = char)
  53. /   1: Unicode in UTF-16 (TCHAR = WCHAR)
  54. /   2: Unicode in UTF-8 (TCHAR = char)
  55. /   3: Unicode in UTF-32 (TCHAR = DWORD)
  56. /
  57. /  Also behavior of string I/O functions will be affected by this option.
  58. /  When LFN is not enabled, this option has no effect. */


  59. #define FF_LFN_BUF                255
  60. #define FF_SFN_BUF                12
  61. /* This set of options defines size of file name members in the FILINFO structure
  62. /  which is used to read out directory items. These values should be suffcient for
  63. /  the file names to read. The maximum possible length of the read file name depends
  64. /  on character encoding. When LFN is not enabled, these options have no effect. */


  65. #define FF_STRF_ENCODE        3
  66. /* When FF_LFN_UNICODE >= 1 with LFN enabled, string I/O functions, f_gets(),
  67. /  f_putc(), f_puts and f_printf() convert the character encoding in it.
  68. /  This option selects assumption of character encoding ON THE FILE to be
  69. /  read/written via those functions.
  70. /
  71. /   0: ANSI/OEM in current CP
  72. /   1: Unicode in UTF-16LE
  73. /   2: Unicode in UTF-16BE
  74. /   3: Unicode in UTF-8
  75. */


  76. #define FF_FS_RPATH                0
  77. /* This option configures support for relative path.
  78. /
  79. /   0: Disable relative path and remove related functions.
  80. /   1: Enable relative path. f_chdir() and f_chdrive() are available.
  81. /   2: f_getcwd() function is available in addition to 1.
  82. */
复制代码
有过类似情况的朋友和原子哥,能否提供一下解决方案。谢谢

最佳答案

查看完整内容[请看2#楼]

经过这两三天的折磨,我利用官方的文件一个一个替换掉我自己的源文件,来回测试,最后替换掉main.c文件就不行了。然后我仔细核对了main.c文件中每一个语句,我都发现我的main和官方的main一字不差,偏偏就是我的调试不成功。最后,重点在这里:我编辑文件用的VScode,编码是UTF-8,官方的编码格式是GB2312也就是GBK格式,偏偏在KEIL里面是看不出来任何异常的。当我拿两份文件到另外一个编辑器中对比,我发现我的文件的中文文字部分 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2019-5-5
在线时间
16 小时
 楼主| 发表于 2019-7-17 15:56:07 | 显示全部楼层
经过这两三天的折磨,我利用官方的文件一个一个替换掉我自己的源文件,来回测试,最后替换掉main.c文件就不行了。然后我仔细核对了main.c文件中每一个语句,我都发现我的main和官方的main一字不差,偏偏就是我的调试不成功。最后,重点在这里:我编辑文件用的VScode,编码是UTF-8,官方的编码格式是GB2312也就是GBK格式,偏偏在KEIL里面是看不出来任何异常的。当我拿两份文件到另外一个编辑器中对比,我发现我的文件的中文文字部分出现了乱码。我觉得问题差不多应该是这里了。等我更改了中文文字部分的编码格式以后,再次下载编译,OK了。

再说一个调试过程的事情,仿真调试,最后发现程序return在CC936.c文件中的ff_convert()函数。替换了官方的CC936.c仍旧是不行。程序一直在ff.c文件中的第1834行返回。
if (!w) return FR_INVALID_NAME;        /* Reject invalid code */

早该想到是编码的问题的,后面注释已经提示的很明显了。但是KEIL,无论是UTF-8还是GBK编码的代码在keil中打开都没有异常,keil我配置的是默认GB2312的编码。不知道是不是GB2312包容UTF-8,这个我没有具体去了解。只有当GBK编码的文件我拿到VScode中打开的时候,会显示乱码。可恶啊
回复

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2019-5-5
在线时间
16 小时
 楼主| 发表于 2019-7-17 16:03:37 | 显示全部楼层
哦,对了,在电脑上读呢,只有文件名是乱码,但是文件内容中文没有乱码。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2019-7-18 02:21:19 | 显示全部楼层
可以参考下我们例程
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2019-5-5
在线时间
16 小时
 楼主| 发表于 2019-7-18 14:49:49 | 显示全部楼层
我把我的FATFS修改后的文件,利用官方的代码工程中使用,一点问题都没有...
回复

使用道具 举报

3

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2017-1-6
在线时间
66 小时
发表于 2020-4-8 13:07:25 | 显示全部楼层
你好,请问楼主 你在往文件里面写内容的时候,有中文吗? 中文写进去有出现什么问题吗?
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2019-12-16
在线时间
9 小时
发表于 2020-4-9 19:59:47 | 显示全部楼层
本帖最后由 lmj0 于 2020-4-10 10:17 编辑
mexico007 发表于 2020-4-8 13:07
你好,请问楼主 你在往文件里面写内容的时候,有中文吗? 中文写进去有出现什么问题吗?
         
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2019-12-16
在线时间
9 小时
发表于 2020-4-9 20:55:36 | 显示全部楼层
mexico007 发表于 2020-4-8 13:07
你好,请问楼主 你在往文件里面写内容的时候,有中文吗? 中文写进去有出现什么问题吗?

我也遇到相同问题,中文写入是没问题的。
后来我将配置中的FF_LFN_UNICODE修改为2(即utf-8),就可以了。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-2 18:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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