搜索
bottom↓
回复: 24

Fatfs 在 SD卡 存储2000多个浮点 数组 的问题

[复制链接]

出0入0汤圆

发表于 2013-11-26 21:01:28 | 显示全部楼层 |阅读模式
本帖最后由 kalo425 于 2013-11-26 21:04 编辑

       
帮同学弄了个新号,没有啥莫元了。都送给你们
是这样的,我有2000多个浮点数据,需要保存data.x 和 data.y,

----------------------------------------------------------
最开始想保存成csv格式的。

问题1,第二行没分开,在一个格子里面。
问题2,那2000多个数据涅??妈蛋··怎么都是空的。外面文件可以7K呢

  f_puts("\t\t\t未处理的光谱数据\r\n",&file);
    f_lseek(&file,file.fptr);
    f_sync(&file);
        f_puts("\t位移\t强度\r\n",&file);

//,我已经加了 制表符号了,妥妥的, “\t” 位移和强度怎么就都在一个格子里面呢?
=================================================
  1.    for(i=0;i<cnt;i++)
  2.     {
  3.         f_printf(&file, "%.2f\t%.0f\r\n",pbuf[i].x,pbuf[i].y);
  4.                 printf("%.2f\t",pbuf[i].x);
  5.     }
复制代码

然后看这个  格式化输出也不对啊·····都是空的,我加了一句从串口打印,打印出来的都是对的·····
--------------------------------------------------------------------------------------------

后来我保存成txt的,还是不行·····看到那个f_printf(&file, "%.2f\t%.0f\r\n",pbuf.x,pbuf.y);  了吧


txt文件里面,没有数据,都是这个 .2f  .f····



=============================

看在40块大洋,我的全部家当的面子上,大家帮帮忙
小弟水平有限,请轻喷哈

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-11-27 18:38:48 | 显示全部楼层
知道肿么回事了,

首先 1,使用逗号分隔符,

注意那个 逗号 哦;

第二,注意那个sprintf 格式化字符,存在 那个变量,我刚开始定义的是  char *,后来char 数组  char [20]  就好了···哎 ,这个问题折腾死我了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-11-26 21:05:46 | 显示全部楼层
最后几行,不知道怎么变成斜体了,我编辑了2次都不行·····排版有点恶心,大家凑合看看哈····关键帮帮伦家嘛··

出0入0汤圆

发表于 2013-11-26 21:21:12 | 显示全部楼层
f_puts 不处理格式化字符

出0入0汤圆

 楼主| 发表于 2013-11-26 23:08:52 | 显示全部楼层
abl 发表于 2013-11-26 21:21
f_puts 不处理格式化字符

但是保存在 txt里面,确实是,有制表符的作用了。

这都不是问题,问题是,我的数据那里去了······我用的f_printf. 当然,我f_write 也用了····

出0入0汤圆

 楼主| 发表于 2013-11-26 23:15:17 | 显示全部楼层
还是没人看···o(︶︿︶)o 唉····明天在试试了。

出0入0汤圆

 楼主| 发表于 2013-11-27 09:04:50 | 显示全部楼层
····························

出0入0汤圆

发表于 2013-11-27 09:22:44 | 显示全部楼层
看一下fats的编码设置, f_puts可能转成unicode了

出0入0汤圆

发表于 2013-11-27 09:23:36 | 显示全部楼层
用英文试试

出0入0汤圆

发表于 2013-11-27 09:27:02 | 显示全部楼层
先用sprintf打印好在写入文件试试

出0入0汤圆

发表于 2013-11-27 10:35:32 | 显示全部楼层
晕,楼主没看CSV文件的格式规则么?CSV就是逗号分隔值的英文缩写哦,不用逗号分隔当然在一个格子里了
http://baike.baidu.com/link?url= ... A2_zPuKolc7BN4CxZFa

出0入0汤圆

 楼主| 发表于 2013-11-27 10:55:15 | 显示全部楼层
skyhu 发表于 2013-11-27 10:35
晕,楼主没看CSV文件的格式规则么?CSV就是逗号分隔值的英文缩写哦,不用逗号分隔当然在一个格子里了{:swea ...

恩,现在我学乖了,不用csv了,用txt格式存储,但是存储的浮点数,全是乱码,肿么办?求助啊

出0入0汤圆

发表于 2013-11-27 11:07:38 | 显示全部楼层
kalo425 发表于 2013-11-27 10:55
恩,现在我学乖了,不用csv了,用txt格式存储,但是存储的浮点数,全是乱码,肿么办?求助啊 ...

f_printf是不支持浮点类型的,建议用sprintf转换成字符,再写进文件

出0入0汤圆

 楼主| 发表于 2013-11-27 11:11:28 | 显示全部楼层
skyhu 发表于 2013-11-27 11:07
f_printf是不支持浮点类型的,建议用sprintf转换成字符,再写进文件

我用sprintf 抓换,然后用 f_write写,还是出错

  1.     for(i=0;i<cnt;i++)
  2.     {
  3.                 sprintf(tempbuf,"\t%.2f\t%.0f\r\n",pbuf[i].x,pbuf[i].y);//格式化写入字符
  4.         //f_printf(&file, "%.2f\t%.0f\r\n",pbuf[i].x,pbuf[i].y);
  5.         //f_puts("\t",&file);
  6.         //f_puts(tempbuf,&file);
  7.         f_write(&file,tempbuf,sizeof(tempbuf),&bw); // 这里写入字节个数怎么算?能用sizeof?
  8.         f_lseek(&file, file.fptr);
  9.         f_sync(&file);
  10.                 printf("%.2f\t",pbuf[i].y); //从串口打印数据,查看是否存储正确
  11.     }
复制代码


我刚看时用的p_puts  和f_printf 发现都不行,现在用了 f_write也不行。没办法了····

出0入0汤圆

 楼主| 发表于 2013-11-27 11:12:43 | 显示全部楼层
usingavr 发表于 2013-11-27 09:27
先用sprintf打印好在写入文件试试

麻烦您,看看13楼我的 程序,就几行,我就是用的sprintf,用f_write 但是还是错的··

出0入0汤圆

发表于 2013-11-27 11:18:12 | 显示全部楼层
哎,你还是把用到的函数用法看明白再写程序吧,sprint函数会返回这个字符串的长度,没必要sizeof(tempbuf),单步跟踪看下tempbuf的内容,看结果正不正确,搞明白是转换的问题还是写入的问题

出65入0汤圆

发表于 2013-11-26 21:01:29 | 显示全部楼层
本帖最后由 luweixuan 于 2013-11-27 11:49 编辑

给你看看我修改的f_printf_0()函数
  1. #include <stdarg.h>
复制代码
  1. // add by user named lux
  2. int f_printf_0 (                        /* Put a formatted string to the file */
  3.                 FIL* fil,
  4.                 const TCHAR* str,
  5.                 ...)               
  6. {
  7.   INT len;
  8.   char buff[512];  
  9.   
  10.   va_list args;
  11.   va_start(args,str);
  12.   len = vsnprintf(buff,512,str,args);
  13.   if (len < 0 )
  14.   {
  15.     va_end(args);
  16.     return len;
  17.   }
  18.   len = f_puts ((TCHAR *)buff,fil);
  19.   va_end(args);
  20.   
  21.   return len;  
  22. }
复制代码


使用示例:
  1. void SaveToFile()
  2. {
  3.   static u8 oldMin=0;
  4.   int r;
  5.   if (oldMin!=RTC_data.Minute)
  6.   {
  7.         oldMin=RTC_data.Minute;
  8.        
  9.         res=f_open(&fsrc_temp,"TEMP.TXT",  FA_OPEN_ALWAYS |FA_WRITE);  // open file
  10.         if (res==FR_OK) uart_printf("Open Tempture File Succes!\r\n");
  11.         else uart_printf("Open Tempture File Fali!\r\n");
  12.        
  13.         f_lseek(&fsrc_temp, f_size(&fsrc_temp));   // point to the end of a file
  14.        
  15.         r=f_printf_0(&fsrc_temp, "%4d/%02d/%02d %02d:%02d %6.2f\r\n",\
  16.           RTC_data.Year,RTC_data.Month,RTC_data.Day,RTC_data.Hour,RTC_data.Minute,RTC_data.Tempture);
  17.         if (r<=0)  uart_printf("Save One Tempture Record Fail!\r\n");
  18.         else uart_printf("Save One Tempture Record Succes!\r\n");
  19.        
  20.         res=f_sync (&fsrc_temp);  // close file
  21.         f_close(&fsrc_temp);
  22.        
  23.   }
  24. }
复制代码

示例中的文件打开和关闭你最好放到循环体外,我这个是一分钟记录一个数据所以不需要放外面。
当然,你最好使用逗号和换行符进行数据分割;\t在数据里面不好处理的,有歧义;

出65入0汤圆

发表于 2013-11-27 11:33:06 | 显示全部楼层
本帖最后由 luweixuan 于 2013-11-27 11:35 编辑
kalo425 发表于 2013-11-27 11:11
我用sprintf 抓换,然后用 f_write写,还是出错

  1. f_lseek(&file, file.fptr);
复制代码
最好放在循环体里的最前面
并且建议使用下面的语句替换上面的语句
  1. f_lseek(&fsrc_temp, f_size(&fsrc_temp));   // point to the end of a file
复制代码

出0入0汤圆

 楼主| 发表于 2013-11-27 13:06:53 | 显示全部楼层
luweixuan 发表于 2013-11-27 11:33
最好放在循环体里的最前面
并且建议使用下面的语句替换上面的语句

恩,谢谢。我去试试

出0入0汤圆

发表于 2014-2-18 21:37:32 | 显示全部楼层
    不错。谢谢分享、

出0入0汤圆

发表于 2014-10-10 11:16:36 | 显示全部楼层
我也遇到这个问题了

出0入8汤圆

发表于 2014-11-3 13:29:00 | 显示全部楼层
好像没有写着怎么存储数据的?

出65入0汤圆

发表于 2014-12-5 15:35:04 | 显示全部楼层
luweixuan 发表于 2013-11-26 21:01
给你看看我修改的f_printf_0()函数

补充一下,经过长时间的测试,发现f_printf_0函数里的
  1.   char buff[512];  
  2.   
  3.   va_list args;
  4.   va_start(args,str);
  5.   len = vsnprintf(buff,512,str,args);
复制代码


       buff长度需要修改,buff长度最大为128,否则在处理较长的字符串转换的过程中会产生内存溢出错误,引起Hardful!
这个应该是vsnprintf库函数引起的,原来在编写这个函数的时候,没仔细追究。当出现问题的时候,才调试跟踪到这里
发现这里出的问题!

出0入0汤圆

发表于 2015-3-19 14:26:58 来自手机 | 显示全部楼层
过来看看

出0入0汤圆

发表于 2017-9-19 13:52:05 | 显示全部楼层
嗯,需要这部分,非常感谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-17 17:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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