你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32文件系统一种存储文件的命名方案

[复制链接]
GKoSon 发布时间:2018-6-8 17:52
做项目,需求有一个需要保存测试报告。前面已经做了SD卡 FATFS 现在就是整理一个string写到.txt文件。
保存在SD卡即可。
问题是:这个文件叫什么名字?
以前板子又RTC可以用时间来命名,不会冲突。
现在是离线的设备 怎么办?
想了个板子 建立一个文件夹叫TMReport 在文件夹里面写文件名字叫:Report.txt  New_Report.txt New_New_Report.txt..这样效果
2222.png
思路框图:写代码的时候发现后缀挺麻烦,直接str操作头部算了,名字长的就是新生成的文本。
333.png
代码:
  1.    FRESULT fr;
  2.     TCHAR str[10];

  3.         char name[50]={0};
  4.         char newname[50]={0};
  5. void Name_Logic(void)//char *name)
  6. {
  7.         u8 rval=0;
  8.         DIR SDdir;       
  9.         FILINFO SDinfo;

  10.         if(Check_Dir_Exist("0:","TMReport2"))//扫描路径下的文件+子文件夹
  11.         {
  12.         //已经存在 啥也不做
  13.                 printf("HAVE DIR");
  14.         }
  15.         else
  16.         {//不存在 创建文件夹
  17.                 mf_mkdir("TMReport1");
  18.           printf("HAVE NO DIR");               
  19.         }
  20.         //准备切换文件夹
  21.         fr = f_getcwd(str, 10);//此时是0根目录 只是debug看的
  22.         f_chdir("0:/TMReport1");
  23.         fr = f_getcwd(str, 10);//此时已经切换
  24.        
  25.         //目录下找是否有文件
  26.         rval=Check_Dir_Exist_EXT((u8*)"0:/TMReport1","Report",name);
  27.         if(rval)
  28.         {
  29.                 Finish+=1;
  30.                 printf("HAVE TXT");
  31.           sprintf(newname,"%s_%s","New",name) ;
  32.         }
  33.         else
  34.         {
  35.                 Finish+=10;
  36.                 printf("HAVE NO TXT");
  37.                 strcpy(newname,"Report.txt");
  38.         }
  39.                 f_open(&fil,newname,(FA_OPEN_ALWAYS|FA_WRITE));//此时不带路径!已经在前面切换了
  40.                 f_close(&fil);
  41. }
复制代码


看网页http://elm-chan.org/fsw/ff/00index_e.html 边看边做的
主要调用的2个函数是在库函数修改来的。
一个是找:是不是存在这个名字的文件夹 一个EXT是找存在这个系列的找到最长的
  1. u8 Check_Dir_Exist_EXT(u8 *path,char *name ,char *Targetname)  
  2. {
  3.         FRESULT res;       
  4.         u8 ack=0;
  5.   char * location;
  6.   char *  target=0;        
  7.   char *fn;   /* This function is assuming non-Unicode cfg. */

  8.         fileinfo.lfsize = _MAX_LFN * 2 + 1;
  9.         fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);
  10.                   
  11.   res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录
  12.   if (res == FR_OK)
  13.         {       
  14.                 printf("\r\n");
  15.                 while(1)
  16.                 {
  17.                 res = f_readdir(&dir, &fileinfo);                   //读取目录下的一个文件
  18.                 if (res != FR_OK || fileinfo.fname[0] == 0) break;  //错误了/到末尾了,退出
  19.                 fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;

  20.                             printf("%s/", path);//打印路径       
  21.                             printf("%s\r\n",  fn);//打印文件名         
  22.                             location= strstr(fn,name);
  23.                                         if(location&&location>target)
  24.                                         {
  25.                                                 ack=1;
  26.                                                 target=location;
  27.                                                 strcpy(Targetname,fn);
  28.                                                 printf("update!!!\n");
  29.                                         }
  30.                 }
  31.    }          
  32.                 myfree(SRAMIN,fileinfo.lfname);
  33.     return ack;          
  34. }

  35. u8 Check_Dir_Exist(u8 *path,char *name )  
  36. {
  37.         FRESULT res;       
  38.         u8 ack=0;          
  39.   char *fn;   /* This function is assuming non-Unicode cfg. */

  40.         fileinfo.lfsize = _MAX_LFN * 2 + 1;
  41.         fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);
  42.                   

  43.   res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录
  44.   if (res == FR_OK)
  45.         {       
  46.                 printf("\r\n");
  47.                 while(1)
  48.                 {
  49.                 res = f_readdir(&dir, &fileinfo);                   //读取目录下的一个文件
  50.                 if (res != FR_OK || fileinfo.fname[0] == 0) break;  //错误了/到末尾了,退出
  51.                 fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;

  52.                             printf("%s/", path);//打印路径       
  53.                             printf("%s\r\n",  fn);//打印文件名         
  54.                                         if(memcmp(fn,name,strlen(name))==0)
  55.                                         {
  56.                                                 ack=1;
  57.                                                 printf("Dir_Exist!!!\n");
  58.                                                 break;
  59.                                         }
  60.                 }
  61.    }          
  62.                 myfree(SRAMIN,fileinfo.lfname);
  63.     return ack;          
  64. }
复制代码
希望大神指点写出很好的逻辑,对FATFS的几个API还在摸一摸阶段
收藏 评论0 发布时间:2018-6-8 17:52

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版