OpenEdv-开源电子网

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

FATFS在SD卡中存储数据至txt文件并通过串口命令新建文件,下达指令后f_open返回8(FR_EXIST),f_sync返回9(FR_INVALID_OBJECT)

[复制链接]

0

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-7-16
在线时间
6 小时
发表于 2019-9-5 22:26:44 | 显示全部楼层 |阅读模式
2金钱
本帖最后由 zhouhexiong 于 2019-9-5 23:30 编辑

如题,使用CubeMX生成FATFS代码,实现在SD卡中存储数据至txt文件并通过串口命令保存数据至新建文件,通过仿真发现下达指令后会立即出现bmpres=f_open返回1(FR_DISK_ERR),idddd=f_sync返回9(FR_INVALID_OBJECT) (图片上传有误,bmpres出错时实际为1)。串口不下达新建文件的指令前数据存储较正常,但长时间存储同样会出现f_sync返回FR_INVALID_OBJECT的问题。其中,NewFlag为串口指令创建新文件的标识,Write_Number保证文件内存储数据的数量。请问造成这种现象的原因是什么,应该如何解决? 具体代码如下:
  1. FATFS mynewdiskFatFs; /* File system object for User logical drive */  // 挂载工作区(文件系统对象)指针
  2. FIL MyFile; /* File object */  // 文件对象结构的指针

  3. char mynewdiskPath[4]; /* User logical drive path */
  4. uint32_t wbytes; /* File write counts */
  5. uint8_t wtext[] = "text to write logical disk\r\n"; /* File write buffer */
  6. /* USER CODE END 4 */
  7. short bmpres=1,holl=1,idddd=1;
  8. char pch[20];
  9. // int inum=0;   // 已经移至最初作为全局变量
  10. unsigned char write_flag=0;
  11. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  12. /* StartDefaultTask function */
  13. void StartDefaultTask(void const * argument)
  14. {       
  15.   /* init code for FATFS */
  16.   for(;;)
  17.   {
  18.                 while(write_flag==0)
  19.                 {
  20.                             write_flag=1;
  21.                                 MX_FATFS_Init();
  22.                                         /* USER CODE BEGIN 5 */
  23.                                         /* Infinite loop */
  24.                                 if(f_mount(&mynewdiskFatFs, (TCHAR const*)mynewdiskPath, 1) != FR_OK)  //确保挂载成功,否则死循环
  25.                                 for(;;);                                                                                                  
  26.                                 do
  27.                                 {                                                       

  28.                                         sprintf((char*)pch,"DEPTH_%d.txt",inum);                                                                                               
  29.                                         bmpres=f_open(&MyFile,(char*)pch,FA_WRITE|FA_CREATE_NEW);       
  30.                                         if(bmpres==FR_OK )
  31.                                         {
  32.                                                 holl=FR_OK;
  33.                                         }
  34.                                         inum=inum+1;                                       
  35.                                 }while(holl!=FR_OK);                                           //确保已经插入SD卡
  36.                 }
  37.                 osDelay(500);
  38.                        
  39.                 f_lseek(&MyFile,MyFile.fsize);
  40.                 f_write(&MyFile, E_Temp, sizeof(E_Temp), (void *)&wbytes);
  41.                 f_printf(&MyFile,",");
  42.                 f_lseek(&MyFile,MyFile.fsize);
  43.                 f_write(&MyFile, Shift_oil, sizeof(Shift_oil), (void *)&wbytes);
  44.                 f_lseek(&MyFile,MyFile.fsize);
  45.                 f_printf(&MyFile,",");
  46.                 f_write(&MyFile, Shift_mass, sizeof(Shift_mass), (void *)&wbytes);
  47.                 f_lseek(&MyFile,MyFile.fsize);
  48.                 f_printf(&MyFile,",");
  49.                 f_write(&MyFile, DEPTH_Output, sizeof(DEPTH_Output), (void *)&wbytes);
  50.                 f_lseek(&MyFile,MyFile.fsize);
  51.                 f_printf(&MyFile,",");
  52.                 f_write(&MyFile, RTCtime_Show, sizeof(RTCtime_Show), (void *)&wbytes);
  53.                 f_lseek(&MyFile,MyFile.fsize);
  54.                 f_printf(&MyFile,"\r\n");
  55.                 osDelay(50);
  56.                 f_sync(&MyFile);
  57.                 idddd=f_sync(&MyFile);

  58.                 if(  Write_Number==0xFF || NewFlag==1)   // NewFlag为串口指令创建新文件的标识,Write_Number保证文件内存储数据的数量  idddd!=FR_OK ||
  59.                         {
  60.                                 write_flag=0;
  61.                                 Write_Number=0;
  62.                                 NewFlag=0;
  63.                                 f_close(&MyFile);
  64.                         }
  65.   }
  66.   /* USER CODE END 5 */
  67. }
复制代码






图1

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

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-7-16
在线时间
6 小时
 楼主| 发表于 2019-9-5 22:37:41 | 显示全部楼层
给自己顶一下,当串口发送新建文件指令时,Newflag赋1,现在怀疑是否是在新建文件的过程中出现了问题,请大佬解惑
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-7-16
在线时间
6 小时
 楼主| 发表于 2019-9-8 16:04:51 | 显示全部楼层
大佬在哪里
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-7-16
在线时间
6 小时
 楼主| 发表于 2019-9-24 21:25:06 | 显示全部楼层
@正点原子   原子哥在哪里
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-16 19:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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