极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 23540|回复: 9

如何把GPS的数据写入到SD卡中?

[复制链接]
发表于 2012-12-18 09:38:30 | 显示全部楼层 |阅读模式
本帖最后由 godpan 于 2012-12-19 10:47 编辑

现在在设计一个长期实验,需要接受GPS和Analog口的数据,并记录到SD卡里面待后进一步分析。

现时还没开始处理Analog口的数据,就已经被GPS的问题卡下来了……{:soso_e109:}

  1. #include <SoftwareSerial.h>

  2. SoftwareSerial gps(6,7);//RX-6;TX-7

  3. char data;

  4. void setup()
  5. {
  6.   Serial.begin(9600);
  7.   gps.begin(9600);
  8. }

  9. void loop()
  10. {
  11.   if(gps.available() > 0) {
  12.     data = gps.read();
  13.     Serial.print(data);
  14.   }
  15. }
复制代码


使用以上代码,可以在电脑中每隔一秒接受一条GPS信息,如:
[pre lang="GPS" line="1"]$GPZDA,122032.000,17,12,2012,,
$GPGGA,122032.000,2301.4607,N,11305.9287,E,1,04,1.9,20.1,M,-7.3,M,,0000
$GPGLL,2301.4607,N,11305.9287,E,122032.000,A,A
$GPGSA,A,3,22,12,14,31,,,,,,,,,4.2,1.9,3.8
$GPGSV,3,1,11,22,62,324,17,12,41,065,22,14,36,332,22,31,28,247,24
$GPGSV,3,2,11,18,75,130,20,25,59,122,16,30,57,146,,21,21,190,
$GPGSV,3,3,11,24,12,040,,15,05,090,,29,04,149,
$GPRMC,122032.000,A,2301.4607,N,11305.9287,E,0.17,271.17,171212,,,A
$GPVTG,271.17,T,,M,0.17,N,0.3,K,A[/code]

但由于如果一秒一条GPS信息的话,数据量太大分析困难,但简单地在loop里面加个“delay(10000)”,则变成每隔10秒出现一个字符的情况{:soso_e149:}

请问怎么才能每隔一段时间接受所有GPS的数据(我不单只要地理位置数据),并记录到SD卡里面?

我尝试过用一些范例把GPS信息替换进去

  1. #include <SD.h>
  2. #include <SoftwareSerial.h>

  3. SoftwareSerial gps(6,7);//RX-6;TX-7
  4. char data;
  5. const int chipSelect = 10  //设定CS接口

  6. void setup()
  7. {
  8.   Serial.begin(9600);    gps.begin(9600);
  9.   pinMode(10, OUTPUT);
  10. }

  11. void loop()
  12. {

  13.   File dataFile = SD.open("datalog.txt", FILE_WRITE);  
  14.    if (dataFile) {
  15.     if(gps.available() > 0)
  16. {
  17.     data = gps.read();
  18.     dataFile.println(data);
  19.     dataFile.close();
  20. }
  21.   }  
  22.   else {
  23.     Serial.println("error opening datalog.txt");
  24.   }
  25. }
复制代码


结果虽然的确把GPS数据写进SD卡里了,但显示结果却是每行一个字符……

该怎么写才能把接受到的GPS数据每隔一段时间(如1分钟)全部都记录到SD卡里面呢?

谢谢!
回复

使用道具 举报

发表于 2012-12-18 10:50:45 | 显示全部楼层
用millis()来取得当前时间,2次millis();的间隔是1秒就读写数据
回复 支持 反对

使用道具 举报

发表于 2012-12-18 12:40:33 | 显示全部楼层
难道是  
dataFile.println(data); 输出行

改成   dataFile.print(data);
回复 支持 反对

使用道具 举报

发表于 2012-12-18 19:46:54 | 显示全部楼层
用变量, 用SD库,有例程可看.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-12-20 12:27:36 | 显示全部楼层
zzzddd9000 发表于 2012-12-18 19:46
用变量, 用SD库,有例程可看.

不明白“用变量”的意思,,可否详细点说??

毕竟只是1只小白
回复 支持 反对

使用道具 举报

发表于 2012-12-20 15:37:28 | 显示全部楼层
小白没关系,我们都从小白过来的
将你程序中的第22行由dataFile.println(data);改成dataFile.print(data);
回复 支持 反对

使用道具 举报

发表于 2013-7-25 17:05:38 | 显示全部楼层
半年还没解决呀,我已处理好了。
首先不要用软串口,我看过头文件,软串口只有64字节的BUFF。而GPS一次输入会超过512字节。
软串口处理时间长易受干扰等式等式问题。

  1. #include <SD.h>
  2. File myFile;
  3. int cont = 0;

  4. void setup() {
  5.     Serial.begin(115200);
  6.     pinMode(10, OUTPUT);
  7.     SD.begin(7);
  8.     myFile = SD.open("nmea.txt", FILE_WRITE);
  9. }

  10. void loop()
  11. {
  12.     while(Serial.available()){
  13.         myFile.write(Serial.read());
  14.     }
  15.    
  16.     //每10字节写入卡里一次
  17.     cont++;
  18.     if(cont > 10){
  19.         myFile.flush();
  20.         cont = 0;
  21.     }
  22. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2013-7-31 10:28:41 | 显示全部楼层
问题似乎没有描述的太清楚,我的理解是,每一秒钟采集一次GPS信息,并且写入SD卡,中间是模拟口采集到的信息?还是,GPS和模拟口信息需要连续采集,1S钟将所有信息写一次SD?
回复 支持 反对

使用道具 举报

发表于 2013-7-31 13:53:17 | 显示全部楼层
值得好好研究!!!
回复 支持 反对

使用道具 举报

发表于 2016-8-4 15:52:59 | 显示全部楼层
dataFile.close();
你写了多少数据文件就关了?
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-17 19:50 , Processed in 0.043254 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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