野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 26972|回复: 15

求助关于FATFS的问题

[复制链接]
发表于 2014-1-6 17:22:23 | 显示全部楼层 |阅读模式
按照《开发实战指南》中的方法把fatfs装好,但是没有装936,因为主要想用sd卡存些数据,而且加了中文文件会变得很大,默认是日文,哼哼......, 所以把_CODE_PAGE设置为1(ASCII only),然后进行读写文件操作。main函数程序如下
int main(void)
{
        USART1_Config();
          NVIC_Configuration();
          f_mount(0,&fs);                  

        res = f_open(&fdst,"0:/db1a.bin",  FA_CREATE_NEW|FA_WRITE);
        textFileBuffer[0]='A';
        textFileBuffer[1]='B';
        res=f_lseek(&fdst,sizeof(fdst));
    /* 将缓冲区的数据写到文件中 */
        res = f_write(&fdst, textFileBuffer, 2, &bw);
             
      /*关闭文件 */
           f_close(&fdst);      
          printf( "file written" );
  while (1)
  {}
}
因为实验中出现了问题,所以把野火的例程进行了很大的简化,能去掉的全去掉了。
理论上应该是文件中就是两个字节,分别是0x41,0x42,但是打开文件发现是这样的
无缘无故多了很多乱码,这是为什么啊?怎么改正啊?

文件读出的情况

文件读出的情况
回复

使用道具 举报

发表于 2014-1-6 17:29:04 | 显示全部楼层
原先 就 有 这样 的一个 文件吧?

res=f_lseek(&fdst,sizeof(fdst));

把 指针 移到 文件 尾部,然后 写入 A/B ,所以 文件 最后就是 这 两个 A/B 啊
回复 支持 反对

使用道具 举报

发表于 2014-1-6 17:30:45 | 显示全部楼层
关闭 了长文件名,就 可以 减少 很多 空间。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-6 17:33:50 | 显示全部楼层
风落小鱼 发表于 2014-1-6 17:29
原先 就 有 这样 的一个 文件吧?

res=f_lseek(&fdst,sizeof(fdst));

事先我把文件清空了,所以文件肯定是空的。写res=f_lseek(&fdst,sizeof(fdst));是为了以后随时把数据加入到文件中。如果加上936,文件写入操作就正常了,但是程序大了很多
回复 支持 反对

使用道具 举报

发表于 2014-1-6 17:38:02 | 显示全部楼层
astronomania 发表于 2014-1-6 17:33
事先我把文件清空了,所以文件肯定是空的。写res=f_lseek(&fdst,sizeof(fdst));是为了以后随时把数据加入 ...

_LFN_UNICODE  改成 0 试试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-6 17:58:40 | 显示全部楼层
风落小鱼 发表于 2014-1-6 17:38
_LFN_UNICODE  改成 0 试试

_LFN_UNICODE一直是0
回复 支持 反对

使用道具 举报

发表于 2014-1-6 18:08:34 | 显示全部楼层
astronomania 发表于 2014-1-6 17:58
_LFN_UNICODE一直是0

_LFN_UNICODE一直是0 ,那么  _CODE_PAGE   改成 936 也 不会 很大体积啊。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-6 18:16:38 | 显示全部楼层
风落小鱼 发表于 2014-1-6 18:08
_LFN_UNICODE一直是0 ,那么  _CODE_PAGE   改成 936 也 不会 很大体积啊。

是不是应该把_USE_LFN改成0啊?
回复 支持 反对

使用道具 举报

发表于 2014-1-6 18:17:43 | 显示全部楼层
astronomania 发表于 2014-1-6 18:16
是不是应该把_USE_LFN改成0啊?

呵呵,刚才是 说错,应该是 把 _USE_LFN改成0
回复 支持 反对

使用道具 举报

发表于 2014-1-6 18:18:33 | 显示全部楼层
风落小鱼 发表于 2014-1-6 18:17
呵呵,刚才是 说错,应该是 把 _USE_LFN改成0

风落小鱼  都 把 问题回答 完了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-6 18:25:34 | 显示全部楼层
风落小鱼 发表于 2014-1-6 18:17
呵呵,刚才是 说错,应该是 把 _USE_LFN改成0

_USE_LFN也一直是0,是不是编码转换的问题?
回复 支持 反对

使用道具 举报

发表于 2014-1-6 18:27:43 | 显示全部楼层
astronomania 发表于 2014-1-6 18:25
_USE_LFN也一直是0,是不是编码转换的问题?

试下 这个 配置 文件:
  1. /*---------------------------------------------------------------------------/
  2. /  FatFs - FAT file system module configuration file  R0.09  (C)ChaN, 2011
  3. /----------------------------------------------------------------------------/
  4. /
  5. / CAUTION! Do not forget to make clean the project after any changes to
  6. / the configuration options.
  7. /
  8. /----------------------------------------------------------------------------*/
  9. #ifndef _FFCONF
  10. #define _FFCONF 6502    /* Revision ID */


  11. /*---------------------------------------------------------------------------/
  12. / Functions and Buffer Configurations
  13. /----------------------------------------------------------------------------*/

  14. #define _FS_TINY        0   /* 0:Normal or 1:Tiny */
  15. /* When _FS_TINY is set to 1, FatFs uses the sector buffer in the file system
  16. /  object instead of the sector buffer in the individual file object for file
  17. /  data transfer. This reduces memory consumption 512 bytes each file object. */
  18. // 文件系统为标准的还是微型的,默认为标准的(0);

  19. #define _FS_READONLY    0   /* 0:Read/Write or 1:Read only */
  20. // 文件系统是否为只读,默认为可读写(0),若只读则f_write、f_sync、 f_unlink、
  21. // f_mkdir、f_chmod、f_rename、f_truncate和f_getfree不可用;


  22. #define _FS_MINIMIZE    0   /* 0 to 3 */
  23. //裁剪文件系统的功能,默认为全部功能(0),若为1、2则会移除大部分链接、目录等功能;
  24. /* The _FS_MINIMIZE option defines minimization level to remove some functions.
  25. /
  26. /   0: Full function.
  27. /   1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename
  28. /      are removed.
  29. /   2: f_opendir and f_readdir are removed in addition to 1.
  30. /   3: f_lseek is removed in addition to 2. */


  31. #define _USE_STRFUNC    2   /* 0:Disable or 1-2:Enable */
  32. /* To enable string functions, set _USE_STRFUNC to 1 or 2. */
  33. //是否允许字符串操作,默认为不允许(0),这个看个人需求,一般情况下设置为1即可,
  34. //如果工作在windows下,为保证文件兼容性(如换行符’\n’和回车符’\r’)建议将此项设置为2;

  35. #define _USE_MKFS       0   /* 0:Disable or 1:Enable */
  36. /* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */
  37. //是否允许使用f_mkfs函数,默认为0,用于创建文件夹,建议开启;

  38. #define _USE_FORWARD    0   /* 0:Disable or 1:Enable */
  39. /* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */
  40. //用于允许f_forward函数,只有开启tiny文件系统时才用到,该函数用于将读写的数据立即
  41. //转存到数据流中,以节省RAM空间;


  42. #define _USE_FASTSEEK   0   /* 0:Disable or 1:Enable */
  43. /* To enable fast seek feature, set _USE_FASTSEEK to 1. */
  44. //是否开启快速索引,默认为0,开启后,会使用FIL结构体中的cltbl元素来加快搜索;



  45. /*---------------------------------------------------------------------------/
  46. / Locale and Namespace Configurations
  47. /----------------------------------------------------------------------------*/

  48. #define _CODE_PAGE  936
  49. //指定目标系统使用的OEM代码页,默认为日语(932),改为936简体中文;
  50. //OEM是什么意思呢?在OS编码中,unicode是一种双字节字符编码,无论中文还是英文,
  51. //或者其他语言统一到2个字节,它与现有的任何编码(ASCII,GB等)都不兼容。
  52. //WindowsNT(2000)的内核即使用该编码,所有数据进入内核前转换成UNICODE,
  53. //退出内核后在转换成版本相关的编码(通常称为OEM,在简体中文版下即为GB);

  54. /* The _CODE_PAGE specifies the OEM code page to be used on the target system.
  55. /  Incorrect setting of the code page can cause a file open failure.
  56. /
  57. /   932  - Japanese Shift-JIS (DBCS, OEM, Windows)
  58. /   936  - Simplified Chinese GBK (DBCS, OEM, Windows)   简体中文
  59. /   949  - Korean (DBCS, OEM, Windows)
  60. /   950  - Traditional Chinese Big5 (DBCS, OEM, Windows)
  61. /   1250 - Central Europe (Windows)
  62. /   1251 - Cyrillic (Windows)
  63. /   1252 - Latin 1 (Windows)
  64. /   1253 - Greek (Windows)
  65. /   1254 - Turkish (Windows)
  66. /   1255 - Hebrew (Windows)
  67. /   1256 - Arabic (Windows)
  68. /   1257 - Baltic (Windows)
  69. /   1258 - Vietnam (OEM, Windows)
  70. /   437  - U.S. (OEM)
  71. /   720  - Arabic (OEM)
  72. /   737  - Greek (OEM)
  73. /   775  - Baltic (OEM)
  74. /   850  - Multilingual Latin 1 (OEM)
  75. /   858  - Multilingual Latin 1 + Euro (OEM)
  76. /   852  - Latin 2 (OEM)
  77. /   855  - Cyrillic (OEM)
  78. /   866  - Russian (OEM)
  79. /   857  - Turkish (OEM)
  80. /   862  - Hebrew (OEM)
  81. /   874  - Thai (OEM, Windows)
  82. /   1    - ASCII only (Valid for non LFN cfg.)
  83. */


  84. #define _USE_LFN    0       /* 0 to 3 */  //LFN :Long File Name 长名字
  85. #define _MAX_LFN    255     /* Maximum LFN length to handle (12 to 255) */
  86. /* The _USE_LFN option switches the LFN support.
  87. /
  88. /   0: Disable LFN feature. _MAX_LFN and _LFN_UNICODE have no effect.
  89. /   1: Enable LFN with static working buffer on the BSS. Always NOT reentrant.
  90. /   2: Enable LFN with dynamic working buffer on the STACK.
  91. /   3: Enable LFN with dynamic working buffer on the HEAP.
  92. /
  93. /  The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. To enable LFN,
  94. /  Unicode handling functions ff_convert() and ff_wtoupper() must be added
  95. /  to the project. When enable to use heap, memory control functions
  96. /  ff_memalloc() and ff_memfree() must be added to the project. */


  97. #define _LFN_UNICODE    0   /* 0:ANSI/OEM or 1:Unicode */
  98. /* To switch the character code set on FatFs API to Unicode,
  99. /  enable LFN feature and set _LFN_UNICODE to 1. */


  100. #define _FS_RPATH       0   /* 0 to 2 */
  101. //是否允许相对路径,让我选择就不开启,否则逻辑变得复杂不说,代码量也变多了一些;
  102. /* The _FS_RPATH option configures relative path feature.
  103. /
  104. /   0: Disable relative path feature and remove related functions.
  105. /   1: Enable relative path. f_chdrive() and f_chdir() are available.
  106. /   2: f_getcwd() is available in addition to 1.
  107. /
  108. /  Note that output of the f_readdir fnction is affected by this option. */



  109. /*---------------------------------------------------------------------------/
  110. / Physical Drive Configurations
  111. /----------------------------------------------------------------------------*/

  112. #define _VOLUMES    1
  113. //磁盘(flash)逻辑卷数,默认为1,不建议修改;
  114. /* Number of volumes (logical drives) to be used. */


  115. #define _MAX_SS     512     /* 512, 1024, 2048 or 4096 */
  116. // 扇区大小,默认512Byte,最大可设置4096Byte;
  117. /* Maximum sector size to be handled.
  118. /  Always set 512 for memory card and hard disk but a larger value may be
  119. /  required for on-board flash memory, floppy disk and optical disk.
  120. /  When _MAX_SS is larger than 512, it configures FatFs to variable sector size
  121. /  and GET_SECTOR_SIZE command must be implememted to the disk_ioctl function. */


  122. #define _MULTI_PARTITION    0   /* 0:Single partition, 1/2:Enable multiple partition */
  123. //分区选项,默认为0,即一个分区,若想要多分区可自行设置;
  124. /* When set to 0, each volume is bound to the same physical drive number and
  125. / it can mount only first primaly partition. When it is set to 1, each volume
  126. / is tied to the partitions listed in VolToPart[]. */


  127. #define _USE_ERASE  0   /* 0:Disable or 1:Enable */
  128. //是否允许扇区擦除,默认为0,若开启则要在disk_ioctl函数中添加擦除命令代码;
  129. /* To enable sector erase feature, set _USE_ERASE to 1. CTRL_ERASE_SECTOR command
  130. /  should be added to the disk_ioctl functio. */



  131. /*---------------------------------------------------------------------------/
  132. / System Configurations
  133. /----------------------------------------------------------------------------*/

  134. #define _WORD_ACCESS    0   /* 0 or 1 */
  135. //数据递进格式,默认为0,即以字节为单位递进,兼容性更强,
  136. //若你的系统最新单位为字(2Byte),则可设为1;
  137. /* Set 0 first and it is always compatible with all platforms. The _WORD_ACCESS
  138. /  option defines which access method is used to the word data on the FAT volume.
  139. /
  140. /   0: Byte-by-byte access.
  141. /   1: Word access. Do not choose this unless following condition is met.
  142. /
  143. /  When the byte order on the memory is big-endian or address miss-aligned word
  144. /  access results incorrect behavior, the _WORD_ACCESS must be set to 0.
  145. /  If it is not the case, the value can also be set to 1 to improve the
  146. /  performance and code size.
  147. */


  148. /* A header file that defines sync object types on the O/S, such as
  149. /  windows.h, ucos_ii.h and semphr.h, must be included prior to ff.h. */

  150. #define _FS_REENTRANT   0       /* 0:Disable or 1:Enable */
  151. #define _FS_TIMEOUT     1000    /* Timeout period in unit of time ticks */
  152. #define _SYNC_t         HANDLE  /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */
  153. //这三个选项与文件系统是否允许重入有关,说直白点,就是能否被多线程同时访问,
  154. //像RTOS中,一般建议开启,_SYNC_t可定义为对应OS中的操作对象,windows下为HANDLE,
  155. //uCos中为OS_EVENT,vxWorks中为SEMAPHORE。另外,开启后还需要添加ff_req_grant、
  156. //ff_rel_grant和ff_del_syncobj三个函数,实际上实现的功能就是申请互斥量、
  157. //释放互斥量和删除互斥量的意思,可以定义OS封装即可;

  158. /* The _FS_REENTRANT option switches the reentrancy (thread safe) of the FatFs module.
  159. /
  160. /   0: Disable reentrancy. _SYNC_t and _FS_TIMEOUT have no effect.
  161. /   1: Enable reentrancy. Also user provided synchronization handlers,
  162. /      ff_req_grant, ff_rel_grant, ff_del_syncobj and ff_cre_syncobj
  163. /      function must be added to the project. */


  164. #define _FS_SHARE   0   /* 0:Disable or >=1:Enable */
  165. /* To enable file shareing feature, set _FS_SHARE to 1 or greater. The value
  166.    defines how many files can be opened simultaneously. */
  167. // 和上面的类似,表示文件系统最大允许同时打开多少文件,默认为0,即只能打开一个。

  168. #endif /* _FFCONFIG */
复制代码
回复 支持 反对

使用道具 举报

发表于 2014-1-6 18:28:30 | 显示全部楼层
另外,检查 一下 f_open 的返回值
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-6 18:41:42 | 显示全部楼层
山外メ雲ジ 发表于 2014-1-6 18:28
另外,检查 一下 f_open 的返回值

好了,用了山外メ雲ジ的方法把问题解决了,另外f_open返回FR_OK,没问题。感觉好像一定要把_CODE_PAGE指定成936,改成别的就不正常了,为什么呢?另外应为没有用len所以文件编译出来小了很多,非常感谢大家啊
回复 支持 反对

使用道具 举报

发表于 2014-1-6 19:13:14 | 显示全部楼层
astronomania 发表于 2014-1-6 18:41
好了,用了山外メ雲ジ的方法把问题解决了,另外f_open返回FR_OK,没问题。感觉好像一定要把_CODE_PAGE指定 ...

解决了 就好 。

_CODE_PAGE ,这个 没 用 长文件名,好像是 不用这些的吧。
回复 支持 反对

使用道具 举报

发表于 2014-1-6 23:25:06 | 显示全部楼层
不使用936 code_page时,要把936那个文件去掉,然后把ff9\option路径下的ccsbcs.c和syscall.c文件添加到工程。(其实syscall.c这个文件忘记要不要添加了,亲自试一下吧)
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 13:50 , Processed in 0.036639 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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