OpenEdv-开源电子网

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

我想利用sprintf函数将一组整型数据转换为字符串格式写入字符数组并用“/”分隔各数据,再将字符数组写入SD卡中。可是每次txt文件中都是只能显示最后一个数据,小白求教。。。

[复制链接]

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-7-1
在线时间
0 小时
发表于 2015-10-20 20:12:51 | 显示全部楼层 |阅读模式
5金钱
建立txt文件没有问题,主要就是格式转换部分(红色部分)。。。希望大家能帮我看看,还想问一句:如何在加速度传感器采集数据的同时就能把数据记录下来呢?
#include "led.h"        //我是在FATFS实验历程的基础上改的
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "sram.h"
#include "malloc.h"
#include "string.h"
#include "mmc_sd.h"
#include "ff.h"
#include "exfuns.h"
#include "usmart.h"
#include "math.h"
#include "beep.h"


 int main(void)
 {  
FIL f_txt;               
FRESULT res;
int *N;
char a[10000];
int i=0,j=150,k=0;
char *Data;
for(i=0;i<100;i++)
{
  k+=sprintf(a,"%d",j);      //这里感觉每次都是在文件的开头写的;我的目的是将整型转换为字符串,以“/”分隔,便于以后的读取、辨认
 j++;
 a[k+1]=46;    //46是“/”的ASCII码
 k=k+2;
}
Data=&a[0]; 
 
delay_init();                                           
NVIC_Configuration(); 
uart_init(9600); LED_Init();        
LCD_Init(); 
BEEP_Init();      
exfuns_init(); 
usmart_dev.init(72);
  mem_init(SRAMIN); 

  POINT_COLOR=RED;
LCD_ShowString(60,50,200,16,16,"2015/10/20");  

while(SD_Initialize())
{
LCD_ShowString(60,70,200,16,16,"SD Card Error!");
delay_ms(200);
LCD_Fill(60,70,240,150+16,WHITE);
delay_ms(200);
LED0=!LED0;
}    
  exfuns_init();
  f_mount(0,fs[0]); 
  f_mount(1,fs[1]);          

  res=f_open(&f_txt,"test.txt",FA_OPEN_ALWAYS | FA_WRITE);    
if(res==0)                                        
{
f_lseek(&f_txt,0);                               
  f_write(&f_txt,Data,strlen(Data),(UINT*)&N);      
f_close(&f_txt);                                  
BEEP=1;
delay_ms(300);
BEEP=0;
}
while(1)
{     
LED0=!LED0;
LED1=!LED1;
delay_ms(200);
LED0=!LED0;
LED1=!LED1;
delay_ms(200);

}

最佳答案

查看完整内容[请看2#楼]

回复【6楼】正点原子: --------------------------------- 谢谢原子哥,这个问题解决了。还想过问一下如何在加速度传感器检测数据的同时保存和记录数据呢?我一直没有想到一个好的方法,麻烦了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-7-1
在线时间
0 小时
 楼主| 发表于 2015-10-20 20:12:52 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
谢谢原子哥,这个问题解决了。还想过问一下如何在加速度传感器检测数据的同时保存和记录数据呢?我一直没有想到一个好的方法,麻烦了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-10-20 22:08:08 | 显示全部楼层
改为: 
for(i=0;i<100;i++)
{
  k+=sprintf(a,"%d",j);     
 j++;
 a[k]=46;   
a+=k;
 k=k+2;
}
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-7-1
在线时间
0 小时
 楼主| 发表于 2015-10-20 22:13:00 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
a+=k;这句话是什么意思?a不是一个字符数组名么?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-10-20 23:30:19 | 显示全部楼层
回复【3楼】一人1人:
---------------------------------
你要往后偏移,否则都是在同一个地址写数据.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-7-1
在线时间
0 小时
 楼主| 发表于 2015-10-22 09:16:54 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
C语言中是不能直接对字符数组名加减,这样编译是通过不了的。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-10-22 23:00:59 | 显示全部楼层
回复【5楼】一人1人:
---------------------------------
确实,你先赋值给指针吧,然后指针偏移即可.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

18

主题

238

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1823
金钱
1823
注册时间
2014-8-5
在线时间
211 小时
发表于 2015-10-24 12:39:51 | 显示全部楼层
楼主试下文件系统里有个跟printf函数相似的函数,f_printf。试下一下代码
 res=f_open(&f_txt,"test.txt",FA_OPEN_ALWAYS | FA_WRITE);     //打开文件
if(res==0)                                        
{
f_lseek(&f_txt,0);                               //移动写指针
for(i=0;i<100;i++)
{
  f_printf(&f_txt,"%d//",j);      //写入数据及/字符,文件地址会自动增加
 j++;
}
f_lseek(&f_txt,0);                               //移动写指针 
 res = f_read(&f_txt,a,f_txt->size,&br);   //读取全部文件数据    此时文件内数据即为上次写入的数据
f_close(&f_txt);   //关闭文件
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-7-1
在线时间
0 小时
 楼主| 发表于 2015-10-27 10:38:32 | 显示全部楼层
这个问题是解决了的,可是我现在拿下面的程序保存加速度传感器的数据就会出现数据重叠的问题。 
 while(1)
{

ADXL345_Read_Average(&x,&y,&z,10);
res=f_open(&f_txt,"test.txt",FA_OPEN_ALWAYS | FA_WRITE);    
if(res==0)                                        
{
f_lseek(&f_txt,k);                                
k+=f_printf(&f_txt,"%d,%d,%d/",x,y,z);            
f_lseek(&f_txt,k);  
f_close(&f_txt);                                
}
LED1=!LED1;
  }
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-11-1 23:11:24 | 显示全部楼层
回复【9楼】一人1人:
---------------------------------
建议直接写入数组,然后保存数组到sd卡试试.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-7-1
在线时间
0 小时
 楼主| 发表于 2015-11-2 16:56:17 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
这个问题已经解决了,是指针的问题
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
41
金钱
41
注册时间
2012-1-17
在线时间
10 小时
发表于 2016-1-11 10:44:35 | 显示全部楼层
楼主float型解决了吗?
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-7-1
在线时间
0 小时
 楼主| 发表于 2016-1-26 16:09:14 | 显示全部楼层
周志浩 发表于 2016-1-11 10:44
楼主float型解决了吗?

没试过。。。
回复

使用道具 举报

0

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-11-26
在线时间
23 小时
发表于 2017-7-6 15:10:36 | 显示全部楼层
我原本也是想将数据保存进字符串中,思路不清楚,这篇帖子帮了我挺大忙
以下是我用指针实现的保存程序,在vs2013中验证过:
/***************************************************************
* prject : 整形数据 到 字符串 的转换实验
* author :
* time   :
***************************************************************/
#include "stdio.h"

int main(void)
{   
        unsigned char j = 0;
    char a[100];
        char *p;
        unsigned char i;
        unsigned int k = 0;

        // 数组写入数据
        p = a;                    
        for (i = 0; i <= 15;i++)
        {
          p = p + sprintf(p, "%d", j);
          if (j == 15)
                  *p = '\0';
          else
      *p = ',';
       p = p + 1;
          j++;

        }
        // 打印数组
        for (i = 0; i<37;i++)
        {
                printf("%c", a[i]);
        }
        return 0;
}
至于前边提到的 浮点数据保存的话,是不是可以保留小数点后三位,*1000转化成整形数据就可以了呢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-17 01:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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