17064浏览
查看: 17064|回复: 3

[求助] arduino读取gps信息

[复制链接]
本帖最后由 Rockets 于 2017-1-17 13:31 编辑

此网址(https://wiki.dfrobot.com.cn/index.php/(SKU:TEL0051)GPS/GPRS/GSM_%E6%89%A9%E5%B1%95%E6%9D%BF_V3.0)给的程序为uno+sim908组合在串口监视器里读取gps信息,但是我的板子是mega2560+sim908,烧完程序后只出时间(而且还不对),其他的都不出,请问是怎么回事?顺序如下:
GPS与Arduino通信
1、硬件连接
将扩展板接到主控板UNO上,插好USB线,Uart Select串口选择开关拨到中间。
2、下载程序
扩展板S1开关拨到Prog端,下载下面程序。

double Datatransfer(char *data_buf,char num)//数据转换:将字符型数据转换为浮点型数据  {                                           //*data_buf:要转换的数组;num:小数点的个数    double temp=0.0;    unsigned char i,j;      if(data_buf[0]=='-')//负数的情况    {      i=1;      //数组中的字符型数据转换成整数并累加      while(data_buf!='.')        temp=temp*10+(data_buf[i++]-0x30);      for(j=0;j<num;j++)        temp=temp*10+(data_buf[++i]-0x30);      //将转换后的整数转换成浮点数      for(j=0;j<num;j++)        temp=temp/10;      //转换成负数      temp=0-temp;    }    else//正数情况    {      i=0;      while(data_buf!='.')        temp=temp*10+(data_buf[i++]-0x30);      for(j=0;j<num;j++)        temp=temp*10+(data_buf[++i]-0x30);      for(j=0;j<num;j++)        temp=temp/10 ;    }    return temp;  }    char ID()//接收语句的ID  {     char i=0;    char value[6]={      '$','G','P','G','G','A'  };//要接收的GPS语句的ID内容    char val[6]={      '0','0','0','0','0','0'  };      while(1)    {      if(Serial.available())      {        val = Serial.read();//接收串口的数据        if(val==value)//对比是否是正确的ID        {              i++;          if(i==6)          {            i=0;            return 1;//接收完毕返回1          }        }        else          i=0;      }    }   }    void comma(char num)//接收逗号字符  {       char val;    char count=0;//对接收到的逗号计数      while(1)    {      if(Serial.available())      {        val = Serial.read();        if(val==',')          count++;      }      if(count==num)//数目正确结束接收        return;    }    }  void UTC()//获取时间信息  {    char i;    char time[9]={      '0','0','0','0','0','0','0','0','0'    };    double t=0.0;      if( ID())//语句正确    {      comma(1);//接收1个逗号      //读取语句第一个逗号后的数据      while(1)      {        if(Serial.available())        {          time = Serial.read();          i++;        }        if(i==9)        {          i=0;          t=Datatransfer(time,2);//转换成浮点型数据          t=t+80000.00;//将时间转换成北京时间          Serial.println(t);//输出时间数据           return;        }        }    }  }  void latitude()//获取纬度信息  {    char i;    char lat[10]={      '0','0','0','0','0','0','0','0','0','0'    };        if( ID())    {      comma(2);      //读取语句第二个逗号后的数据      while(1)      {        if(Serial.available())        {          lat = Serial.read();          i++;        }        if(i==10)        {          i=0;          Serial.println(Datatransfer(lat,5),5);//输出纬度数据           return;        }        }    }  }  void lat_dir()//获取纬度方向信息  {    char i=0,val;      if( ID())    {      comma(3);      //读取语句第三个逗号后的数据      while(1)      {        if(Serial.available())        {          val = Serial.read();          Serial.write(val);//输出方向信息          Serial.println();          i++;        }        if(i==1)        {          i=0;          return;        }        }    }  }  void longitude()//获取经度信息  {    char i;    char lon[11]={      '0','0','0','0','0','0','0','0','0','0','0'    };      if( ID())    {      comma(4);      //读取语句第四个逗号后的数据      while(1)      {        if(Serial.available())        {          lon = Serial.read();          i++;        }        if(i==11)        {          i=0;          Serial.println(Datatransfer(lon,5),5);//输出经度数据          return;        }        }    }  }  void lon_dir()//获取经度方向信息  {    char i=0,val;      if( ID())    {      comma(5);      //读取语句第五个逗号后的数据      while(1)      {        if(Serial.available())        {          val = Serial.read();          Serial.write(val);//输出经度方向          Serial.println();          i++;        }        if(i==1)        {          i=0;          return;        }        }    }  }  void altitude()//获取海拔信息  {    char i,flag=0;    char alt[8]={      '0','0','0','0','0','0','0','0'    };      if( ID())    {      comma(9);      //读取语句第九个逗号后的数据      while(1)      {        if(Serial.available())        {          alt = Serial.read();          if(alt==',')            flag=1;          else            i++;        }        if(flag)        {          i=0;          Serial.println(Datatransfer(alt,1),1);//输出海拔数据           return;        }        }    }  }  void setup()  {    //设置引脚为输出模式    pinMode(3,OUTPUT);    pinMode(4,OUTPUT);    pinMode(5,OUTPUT);    //GSM开机时序     digitalWrite(5,HIGH);    delay(1500);    digitalWrite(5,LOW);         //使能GSM串口     digitalWrite(3,LOW);     digitalWrite(4,HIGH);     delay(2000);     //设置波特率     Serial.begin(9600);      //等待GPS ready     delay(5000);          //发送AT命令同步     Serial.println("AT");        delay(2000);     //turn on GPS power supply     Serial.println("AT+CGPSPWR=1");     delay(1000);     //reset GPS in autonomy mode     Serial.println("AT+CGPSRST=1");     delay(1000);          //使能GPS串口     digitalWrite(4,LOW);     digitalWrite(3,HIGH);     delay(2000);          Serial.println("$GPGGA statement information: ");  }  void loop()  {    while(1)    {       Serial.print("UTC:");      UTC();      Serial.print("Lat:");      latitude();      Serial.print("Dir:");      lat_dir();      Serial.print("Lon:");      longitude();      Serial.print("Dir:");      lon_dir();      Serial.print("Alt:");      altitude();      Serial.println(' ');      Serial.println(' ');    }  }
3、设置扩展板与Arduino通信
S1按键拨到Comm端,S2按键拨到Arduino端。

hnyzcj  版主

发表于 2017-1-15 11:49:13

漏主,把代码也编辑一下
回复

使用道具 举报

-stark  中级技师

发表于 2017-1-17 11:16:15

楼主您好,sim908模块的使用需要注意三个问题
1.开关是否按照wiki拨动
2.置于室外2-5分钟才会有数据输出
3.可以尝试外部供电
回复

使用道具 举报

Rockets  NPC

发表于 2017-1-17 13:32:10

想试着改下楼主代码格式,发现实在太麻烦,算了,楼主自己改吧。
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
关于楼主

楼主的其它帖子

上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail