OpenEdv-开源电子网

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

急切求教:关于采集的ADC数据存入SD卡的问题

[复制链接]

1

主题

7

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-11-2
在线时间
0 小时
发表于 2013-11-2 15:34:52 | 显示全部楼层 |阅读模式
     各位高手你们好!我是退休的老头,回农村种地。不懂英语,更不会编写程序。看到汶川地震的惨景,萌生了检测地电场监测地震的念头,手工记录信息两年多,人工测试有很多不足,想用单片机实现自动记录,购买现成产品价格高的吓人,本人钱兜羞涩。于是购买了战舰STM32F103ZET6开发板,想自己编程。参照例程完成了ADC 数据采集,RTC时钟定时,能定时采集数据,实现SDIO的驱动,移植了FAT32文件系统,能向sd卡中写入数据。但怎样把采集的ADC数据,连同采集的时间一同记录到卡中却实现不了,在此求高手帮助,本人将自己种的不用农药的农产品馈赠,以示感谢。有意援助的高手联系我:QQ 1730534715 谢谢!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-2 21:44:48 | 显示全部楼层
实现SD卡FATFS驱动了就简单了。
可以新建TXT文件,然后往里面写入ADC数据就可以了。
实现新建TXT文件了么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-11-2
在线时间
0 小时
 楼主| 发表于 2013-11-3 12:45:52 | 显示全部楼层
 原子老师您好!我已实现SD卡的驱动,也成功移植了FATFS文件系统,如定义一个字符串  unsigned char buff[26]="2013,08,28,16,28.279";
           用 f_mount(0,&fs);                                                                      //在sd卡的0逻辑盘上注册工作区域,挂载o盘即sd卡
               res=f_open(&fsrc,"0:/shj/a.txt",FA_OPEN_ALWAYS|FA_WRITE);  //以写的方式打开sd卡上shj文件夹中名为a的文件
               if(res==FR_OK)                                                                    //如果文件成功打开
                 {
                    res=f_lseek(&fsrc,fsrc.fsize);                                              //将移动文件指针函数,的指针移到文件末尾                   
                     res=f_write(&fsrc,buff,20,&bw);                                       //向这打开的文件中写入buff里的数据
                  }
                f_close(&fsrc);                                                                    //关闭文件可以向卡里写字符串
    可以把[2013,08,28,16,28,279]写入卡中,如下图



想把RTC例程中时间结构体,和ADC例程中采集的数据用格式化函数
int psprintf(shu,"%8d----", calendar.min------);整合成一个数据串写入sd卡,但编译通不过,把他们组成一个结构体。
struct shuju_type
    {vu16 calendar_w_year;   //年份  
      vu8 calendar_w_month;  //月份
     vu8 calendar_w_date;   //日期
     vu8 calendar_hour;  //小时
     vu8 calendar_min;   //分钟
     float NS;  //南北向电压    
     float EM;  //东西向电压
    }shu[1]={2013,8,16,16,12,2661,3121};写入的是乱码如下图



烦您解答,十分感谢!





回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-3 19:58:07 | 显示全部楼层
很简单,可以利用sprintf,输出到一个数组里面,然后把数组写入到文件里面,就可以达到你要的效果了。
比如:
buf[100];
sprintf(buf,"RTC TIME:%04d年 %02d月 %02d日 %02d时 %02d分 %02d秒",rtc.year,rtc.month,rtc.date,rtc.hour,rtc.min,rtc.sec);
...
res=f_write(&fsrc,buf,strlen(buf),&bw);                                       //写入年月日时分秒数据。
...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-11-2
在线时间
0 小时
 楼主| 发表于 2013-11-4 07:28:43 | 显示全部楼层
 谢谢您,我试试。
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-11-2
在线时间
0 小时
 楼主| 发表于 2013-11-4 14:35:18 | 显示全部楼层
您好!
以前我也是想用:
unsigned char buf[100];
sprintf(buf,"RTC TIME:%04d %02d %02d %02d %02d 02d",rtc.year,rtc.month,rtc.date,rtc.hour,rtc.min,rtc.sec);
的办法
把时间和采集的数据格式化成字符串输出到一个数组里面,再用
res=f_write(&fsrc,buf,strlen(buf),&bw);
函数写入sd卡,可在编译时出现下面的错误。要求添加标识符等。我英语不好,没有编程基础,身边没有老师教,全是按照战舰STM32开发板光盘资料,网上搜索摸索学点。资料上没有要求声明sprintf函数的类型,及怎样添加标识符,所以我就不会了。还需劳驾您给解决。谢谢!
compiling main.c...
main.c(91): error:  #40: expected an identifier
main.c:   sprintf(buf,"RTC TIME:%04d %02d %02d %02d %02d %02d",rtc.year,rtc.month,rtc.date,rtc.hour,rtc.min,rtc.sec);
main.c:               ^
main.c(91): error:  #18: expected a ")"
main.c:   sprintf(buf,"RTC TIME:%04d %02d %02d %02d %02d %02d",rtc.year,rtc.month,rtc.date,rtc.hour,rtc.min,rtc.sec);
main.c:                                                           ^
main.c(91): warning:  #77-D: this declaration has no storage class or type specifier
main.c:   sprintf(buf,"RTC TIME:%04d %02d %02d %02d %02d %02d",rtc.year,rtc.month,rtc.date,rtc.hour,rtc.min,rtc.sec);
main.c:   ^
main.c(91): error:  #92: identifier-list parameters may only be used in a function definition
main.c:   sprintf(buf,"RTC TIME:%04d %02d %02d %02d %02d %02d",rtc.year,rtc.month,rtc.date,rtc.hour,rtc.min,rtc.sec);
main.c:   ^
main.c(91): error:  #147-D: declaration is incompatible with "int sprintf(char *restrict, const char *restrict,     ...)" (declared at line 376 of "C:\Keil\ARM\RV31\INC\stdio.h")
main.c:   sprintf(buf,"RTC TIME:%04d %02d %02d %02d %02d %02d",rtc.year,rtc.month,rtc.date,rtc.hour,rtc.min,rtc.sec);
main.c:   ^
main.c(141): warning:  #167-D: argument of type "unsigned char *" is incompatible with parameter of type "const char *"
main.c:                         res=f_write(&fsrc,buf,strlen(buf),&bw);
main.c:                                                      ^
main.c: main.c: 2 warnings, 4 errors
Target not created
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-4 20:11:55 | 显示全部楼层
回复【6楼】guyu98:
---------------------------------
你的rtc结构体定义了么????
如果没有,就不能这么写,我给你的只是个参考代码.
你看我们战舰板的例程,RTC是用了结构体的.
//时间结构体
typedef struct 
{
vu8 hour;
vu8 min;
vu8 sec;
//公历日月年周
vu16 w_year;
vu8  w_month;
vu8  w_date;
vu8  week;  
}_calendar_obj;  
extern _calendar_obj calendar; //日历结构体

然后,我就可以用:
calendar.hour;
calendar.min;
calendar.sec;
....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-11-2
在线时间
0 小时
 楼主| 发表于 2013-11-5 14:19:33 | 显示全部楼层

 您好!

时间结构体,我使用的就是战舰光盘里RTC例程中h文件中定义的那个时间结构体,编译时也是出现上面的错误,我估计不是这里的问题,是不是与 Keil uVision4里的定义有冲突?
您如果有这方面的例程,我可否参考一下。
我再慢慢研究研究,有问题再请教您,这样模糊的问题,您不审查全部程序,是不好回答的。
    谢谢您!

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-5 19:04:06 | 显示全部楼层
回复【8楼】guyu98:
---------------------------------
战舰板的RTC实验,编译会报错???
那你旺旺联系我吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-11-2
在线时间
0 小时
 楼主| 发表于 2013-11-6 15:25:37 | 显示全部楼层

 您好!

  战舰中的所有例程都能顺利编译,没有半点问题,如果使用下面红色部分定义的字符串,能通过编译,所有程序模块运行正常, 但想把时间和采集的变量数据用蓝色的格式化函数处理时编译通不过,提示出错的就是下面sprintf函数。
 我的主函数如下:
unsigned char buf[100];
sprintf(buf,"RTC TIME:%04d %02d %02d %02d %02d %02d",calendar.year,calendar.month,calendar.date,calendar.hour,calendar.min,calendar.sec);

unsigned char shu[20];
char shu[20]="2013 08 16 12 NS28 EM89";
int main(void)
{

        u8 t=0; 
        delay_init();       //延时函数初始化  
 NVIC_Configuration();   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
 uart_init(9600);   //串口初始化为9600
 
        LED_Init();        //LED端口初始化
        LCD_Init();
        KG_Init();
        Adc_Init();
        RTC_Init();
        
      
           //显示时间
 OINT_COLOR=BLUE;//设置字体为蓝色     
 LCD_ShowString(1,1,200,11,16,"    -  -  /");
 OINT_COLOR=RED;//设置字体为红色 
 LCD_ShowString(88,1,200,8,16,"  :  :  ");
    while(1)
 {           
  if(t!=calendar.sec)  //如果 calendar日历
  {
   t=calendar.sec;  //时间t在正秒时
   LCD_ShowNum(1,1,calendar.w_year,4,16);   //显示年         
   LCD_ShowNum(40,1,calendar.w_month,2,16);  //显示月         
   LCD_ShowNum(64,1,calendar.w_date,2,16);  //显示日
   
   LCD_ShowNum(88,1,calendar.hour,2,16);   //显示小时         
   LCD_ShowNum(112,1,calendar.min,2,16);   //显示分         
   LCD_ShowNum(136,1,calendar.sec,2,16);   //显示秒
   LED0=!LED0;
                      
                     
  }
           
               else if (chf==1) //
  {
                 xianshi();   //执行ADC的采集和显示程序 
                   
               f_mount(0,&fs);                          //在sd卡的0逻辑盘上注册工作区域,挂载o盘即sd卡
               res=f_open(&fsrc,"0:/shj/a.txt",FA_OPEN_ALWAYS|FA_WRITE);  //以写的方式打开sd卡上shj文件夹中名为a的文件
               if(res==FR_OK)                           //如果文件成功打开
                 {
                    res=f_lseek(&fsrc,fsrc.fsize);           //将移动文件指针函数,的指针移到文件末尾,否则写入的新数据会覆盖原数据
                     res=f_write(&fsrc,buf,strlen(buf),&bw);
                  }
                f_close(&fsrc);                          //关闭文件
                LED3=!LED3;
                delay_ms(200);                       
  }
               else             //否则
                {
                 continue;   //跳过以下部分回到上面继续循环 continue结束本次循环
                 }
      }    
  
我把战舰板中的RTC,ADC,LDC,SD,及文件系统fatfs各模块稍加修改,加入了屏幕显示控制KG,能顺利编译,程序运行正常。
如果定义一个数组   unsigned char buff[26]="2013,08,28,16,28.2798,hao";能把2013,08,28,16,28.2798,hao写入SD卡中
只是上面蓝色部分报错,好久没有找出问题所在。

回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-11-6 15:50:46 | 显示全部楼层
引用stdio.h了吗
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-11-2
在线时间
0 小时
 楼主| 发表于 2013-11-7 14:25:55 | 显示全部楼层

 您好!

     您真神了,头文件stdio.h被我注释掉了,还有格式化函数sprintf(buf,"%04d %02d %02d %02d %02d 02d",calendar_w.year,calendar_w.month,calendar_w.date,calendar.hour,calendar.min,calendar.sec);可能放错了地方,把它放到主函数的while(1)里,编译时就只剩一个警告一个错误了。
错误是:标识符calendar_w是不明确的  main.c(134): error:  #20: identifier "calendar_w" is undefined
警告是:buf的类型不符                      main.c(134): warning:  #167-D: argument of type "unsigned char *" is incompatible with parameter of type "char *restrict"
      这与成功又进了一步,您涓涓教诲我这一窍不通的老头学生,真是难为您了,在此表示深情的感谢!

回复 支持 反对

使用道具 举报

8

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2013-12-16
在线时间
0 小时
发表于 2015-4-11 08:33:43 | 显示全部楼层
回复【3楼】guyu98:
---------------------------------
楼主你好,我也在移植FAT32文件系统,f_write函数不知怎么实现
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2015-4-12
在线时间
0 小时
发表于 2015-4-24 00:26:51 | 显示全部楼层
楼主,你好,能否把你的代码给我也发一份学习。不胜感激。610944269@qq.com
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-2 12:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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