野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5308|回复: 4

fatfs中f_read读到的字节数错误且f_close返回9(FR_INVALID_OBJECT)

[复制链接]
发表于 2022-9-5 23:28:47 | 显示全部楼层 |阅读模式
  1. FATFS fsObject;//一个大的结构体,包含文件系统的各种定义,取地址后作为f_mount的实参
  2. FIL fp;//文件句柄,先给fopen函数,用作为各种fwrite、fread函数的实参
  3. const char wDATA[] = "hello gugu,欢迎使用stm32野火开发板~";//需要写入文件的数据
  4. //const int wDATA[] = {1,2,3,4,5,6};也可以写入非字符串数据
  5. UINT bw;//定义f_write函数已经写入的字节数
  6. char rDATA[] = "";//用于存放从写入后的文件所读取的数据
  7. UINT br;//定义f_read函数已经读取的字节数
  8. DIR dir;//路径(文件夹)句柄

  9. /**
  10.   * [url=home.php?mod=space&uid=41770]@brief[/url]  主函数
  11.   * @param  无
  12.   * @retval 无
  13.   */
  14. int main(void)
  15. {
  16.         FRESULT res;
  17.         
  18.   LED_GPIO_Config();
  19.         LED_BLUE;
  20.         
  21.         USART_Config();
  22.         printf("这是一个FATFS文件系统移植实验 \r\n");
  23.         
  24.         res = f_mount(&fsObject,"1:",1);//文件系统挂载函数,移植文件系统前必须调用的函数,经过层层调用会调到disk_initialize函数
  25.         
  26.         printf("f_mount res = %d\n",res);
  27.         
  28.         if(res == FR_NO_FILESYSTEM){//当返回"没有文件系统时",调用格式化函数,以删除磁盘原有数据,并生成文件系统信息
  29.                 res = f_mkfs ("1:", 0, 0);//使用f_mkfs函数需要在ffconf.h头文件中使能
  30.                 printf("f_mkfs res = %d\n",res);
  31.                
  32.                 res = f_mount(NULL,"1:",1);//格式化后必须取消挂载,再重新挂载
  33.                 res = f_mount(&fsObject,"1:",1);
  34.                 printf("2nd f_mount res = %d\n",res);
  35.         }        
  36.         
  37.         //系统挂载成功后,可以进行文件操作,先打开文件
  38.         res = f_open(&fp,"1:宝贝猪.txt",FA_OPEN_ALWAYS | FA_READ | FA_WRITE);//按位或?
  39.         printf("f_open res = %d\n",res);
  40.         if(res == FR_OK){//文件成功打开后,可以写入数据
  41.                 res = f_write(&fp, wDATA,sizeof(wDATA), &bw);
  42.                 printf("f_write res = %d;写入的字节数 = %d\n",res, bw);
  43.                
  44.                 if(res == FR_OK){//写入成功后,可以读取数据
  45.                         f_rewind(&fp);//注意写完数据后,文件位置指针指向文件末尾,需要先将文件位置指针移至开头
  46.                         res = f_read(&fp, rDATA,f_size(&fp), &br);//注意此处通过f_size来获取文件大小
  47.                         printf("f_read res = %d;读取的字节数 = %d\n",res, br);
  48.                         
  49.                         if(res == FR_OK){//读取成功后,可以打印数据到串口
  50.                                 printf("文件内容:%s\n",rDATA);
  51.                         }
  52.                 }
  53.                 res = f_close(&fp);
  54.                 printf("f_close res = %d\n",res);
复制代码
串口打印如图

回复

使用道具 举报

 楼主| 发表于 2022-9-5 23:29:40 | 显示全部楼层
野火论坛202209052329071835..png
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-6 23:42:15 | 显示全部楼层
有没有大佬知道,急求
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-7 23:49:07 来自手机 | 显示全部楼层
再次问问大佬,有没有知道的
回复 支持 反对

使用道具 举报

发表于 2022-9-8 09:18:06 | 显示全部楼层
恐怕得在源代码中找这个返回值代表的含义。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-4 11:02 , Processed in 0.028943 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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