sd卡建立文件夹后再建立文件,建立文件时返回值说找不到路径?

2019-07-20 23:54发布

[mw_shl_code=c,true]#define __SHOW_SD_PROCEDURE__ RTC_TimeTypeDef RTC_TimeStruct; //__align(8) 8字节对其 RTC_DateTypeDef RTC_DateStruct; char FileDirName[16]; int j = 0; DIR FileDir; DIR* CreateNewFileDir(void) { sprintf(FileDirName, "/%02d-%2d-%2d",RTC_DateStruct.RTC_Year, RTC_DateStruct.RTC_Month, RTC_DateStruct.RTC_Date); f_mkdir(FileDirName); //以当前的日期创建一个文件夹 } static int i = 0; char FileName[64]; char CntBuf[64]; u8 res_open = 1; int open = 0; char date[16]; char time[16]; FIL File; FIL* CreateNewFile(void) { sprintf(FileName, "/%02d-%2d-%2d/%02d-%2d-%2d.txt", RTC_DateStruct.RTC_Year, RTC_DateStruct.RTC_Month, RTC_DateStruct.RTC_Date, RTC_TimeStruct.RTC_Hours, RTC_TimeStruct.RTC_Minutes, RTC_TimeStruct.RTC_Seconds); sprintf(date, "Date: %02d:%02d:%02d",RTC_DateStruct.RTC_Year,RTC_DateStruct.RTC_Month,RTC_DateStruct.RTC_Date); sprintf(time, "Time: %02d:%02d:%02d",RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds); LCD_ShowString(60, 80, 210, 16, 16, date); LCD_ShowString(60, 110, 210, 16, 16, time); while(res_open!=0) { res_open = f_open(&File, FileName, FA_OPEN_ALWAYS | FA_WRITE ); if(++open > 2) { sprintf(CntBuf, "f_open = %d", res_open); LCD_ShowString(60, 50, 210, 16, 16, CntBuf); } } res_open = 1; open = 0; f_lseek(&File, 0); #ifdef __SHOW_SD_PROCEDURE__ LCD_ShowString(60, 140, 210, 16, 16, FileName); #endif LCD_ShowString(60, 170, 210, 16, 16, "CreateNewFile = "); LCD_ShowNum(200, 170, ++i, 8, 16); return &File; } #define FILE_BLOCK_CNT 20 int FileBlockCnt = 0; int FileCnt = 0; int NowDate=0; int main(void) { char CntBuf[64]; FIL *SDFile = NULL; //------------------------------- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 //------------------------------- delay_init(168); // 初始化延时函数 uart_init(115200); // 初始化串口波特率为115200 LED_Init(); // 初始化LED LCD_Init(); // LCD初始化 RS485_Init(115200); // 初始化RS485串口2 RTC_Set_WakeUp(RTC_WakeUpClock_CK_SPRE_16bits, 0); // 配置WAKE UP中断,1秒钟中断一次 IWDG_Init(4, 2500); //与分频数为64,重载值为2500,溢出时间为5s exfuns_init(); //为fatfs相关变量申请内存 usmart_dev.init(72); my_mem_init(SRAMIN); //初始化内部内存池 SD_InitializeCards(); f_mount(fs[0], "0:", 1); //注册工作区 // //----------------------------- while(1) { if(QueueFullWithData) { if(FileBlockCnt == 0) { IWDG_Feed(); //喂狗 RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct); RTC_GetTime(RTC_Format_BIN, &RTC_TimeStruct); if (NowDate!=RTC_DateStruct.RTC_Date) { CreateNewFileDir(); NowDate = RTC_DateStruct.RTC_Date; } SDFile = CreateNewFile(); IWDG_Feed(); //喂狗 //sd卡存储的内容越多,打开的时间越慢 } f_write(SDFile, QueueFullWithData, QUEUE_SIZE, (UINT*)&bw); delay_ms(10); QueueFullWithData = NULL; LCD_ShowString(60, 200, 210, 16, 16, "Saved File Block = "); LCD_ShowNum(200, 200, ++FileBlockCnt, 8, 16); if(FileBlockCnt == FILE_BLOCK_CNT) { f_close(SDFile); FileBlockCnt = 0; LCD_ShowString(60, 230, 210, 16, 16, "Saved File Cnt = "); LCD_ShowNum(200, 230, ++FileCnt, 8, 16); } } IWDG_Feed(); //喂狗 } }[/mw_shl_code] [mw_shl_code=c,true]建立好文件夹以后,往文件夹里面建立txt文件,结果返回值说找不到路径,请问是哪里有错了?[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
kekehuhu
1楼-- · 2019-07-21 04:57
问题解决了,是由于sd卡中已经有了要建立的文件夹,导致f_mkdir(FileDirName);            //以当前的日期创建一个文件夹
这句的返回值为FR_EXITING,所以f_open才会返回5
kekehuhu
2楼-- · 2019-07-21 08:59
f_open的返回值是5,NO_PATH
正点原子
3楼-- · 2019-07-21 12:09
新建完close了么?
kekehuhu
4楼-- · 2019-07-21 14:03
回复【3楼】正点原子:
---------------------------------
是新建完文件夹要close吗 ,还是新建完文件close?新建文件每次都close了。
新上电的时候如果sd卡是直接插在板子上的f_open会返回5,然后把sd卡拔出来重新插入后会好。
正点原子
5楼-- · 2019-07-21 18:59
回复【4楼】kekehuhu:
---------------------------------
新建文件要close。
文件夹没试过。
kekehuhu
6楼-- · 2019-07-21 22:44
[mw_shl_code=c,true]024 sprintf(FileName, "/%02d-%2d-%2d/%02d-%2d-%2d.txt", 025 RTC_DateStruct.RTC_Year, RTC_DateStruct.RTC_Month, 026 RTC_DateStruct.RTC_Date, RTC_TimeStruct.RTC_Hours, 027 RTC_TimeStruct.RTC_Minutes, RTC_TimeStruct.RTC_Seconds); 028 sprintf(date, "Date: %02d:%02d:%02d",RTC_DateStruct.RTC_Year,RTC_DateStruct.RTC_Month,RTC_DateStruct.RTC_Date); 029 sprintf(time, "Time: %02d:%02d:%02d",RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds); 030 LCD_ShowString(60, 80, 210, 16, 16, date); 031 LCD_ShowString(60, 110, 210, 16, 16, time); 032 033 while(res_open!=0) 034 { 035 res_open = f_open(&File, FileName, FA_OPEN_ALWAYS | FA_WRITE ); 036 if(++open > 2) 037 { 038 sprintf(CntBuf, "f_open = %d", res_open); 039 LCD_ShowString(60, 50, 210, 16, 16, CntBuf); 040 } 041 } [/mw_shl_code] 就这块的f_open返回值为5,说是没有路径,可是我单步跟踪路径格式是对的,把卡拔下来插上就又可以了,就时不能直接把卡插在板子上直接上电工作。

一周热门 更多>