新手入门
- 积分
- 15
- 金钱
- 15
- 注册时间
- 2019-7-16
- 在线时间
- 6 小时
|
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保证文件内存储数据的数量。请问造成这种现象的原因是什么,应该如何解决? 具体代码如下:- FATFS mynewdiskFatFs; /* File system object for User logical drive */ // 挂载工作区(文件系统对象)指针
- FIL MyFile; /* File object */ // 文件对象结构的指针
- char mynewdiskPath[4]; /* User logical drive path */
- uint32_t wbytes; /* File write counts */
- uint8_t wtext[] = "text to write logical disk\r\n"; /* File write buffer */
- /* USER CODE END 4 */
- short bmpres=1,holl=1,idddd=1;
- char pch[20];
- // int inum=0; // 已经移至最初作为全局变量
- unsigned char write_flag=0;
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- /* StartDefaultTask function */
- void StartDefaultTask(void const * argument)
- {
- /* init code for FATFS */
- for(;;)
- {
- while(write_flag==0)
- {
- write_flag=1;
- MX_FATFS_Init();
- /* USER CODE BEGIN 5 */
- /* Infinite loop */
- if(f_mount(&mynewdiskFatFs, (TCHAR const*)mynewdiskPath, 1) != FR_OK) //确保挂载成功,否则死循环
- for(;;);
- do
- {
- sprintf((char*)pch,"DEPTH_%d.txt",inum);
- bmpres=f_open(&MyFile,(char*)pch,FA_WRITE|FA_CREATE_NEW);
- if(bmpres==FR_OK )
- {
- holl=FR_OK;
- }
- inum=inum+1;
- }while(holl!=FR_OK); //确保已经插入SD卡
- }
- osDelay(500);
-
- f_lseek(&MyFile,MyFile.fsize);
- f_write(&MyFile, E_Temp, sizeof(E_Temp), (void *)&wbytes);
- f_printf(&MyFile,",");
- f_lseek(&MyFile,MyFile.fsize);
- f_write(&MyFile, Shift_oil, sizeof(Shift_oil), (void *)&wbytes);
- f_lseek(&MyFile,MyFile.fsize);
- f_printf(&MyFile,",");
- f_write(&MyFile, Shift_mass, sizeof(Shift_mass), (void *)&wbytes);
- f_lseek(&MyFile,MyFile.fsize);
- f_printf(&MyFile,",");
- f_write(&MyFile, DEPTH_Output, sizeof(DEPTH_Output), (void *)&wbytes);
- f_lseek(&MyFile,MyFile.fsize);
- f_printf(&MyFile,",");
- f_write(&MyFile, RTCtime_Show, sizeof(RTCtime_Show), (void *)&wbytes);
- f_lseek(&MyFile,MyFile.fsize);
- f_printf(&MyFile,"\r\n");
- osDelay(50);
- f_sync(&MyFile);
- idddd=f_sync(&MyFile);
- if( Write_Number==0xFF || NewFlag==1) // NewFlag为串口指令创建新文件的标识,Write_Number保证文件内存储数据的数量 idddd!=FR_OK ||
- {
- write_flag=0;
- Write_Number=0;
- NewFlag=0;
- f_close(&MyFile);
- }
- }
- /* USER CODE END 5 */
- }
复制代码
|
-
图1
|