arduino小白 发表于 2017-1-14 23:06:36

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=='-')//负数的情况    {      i=1;      //数组中的字符型数据转换成整数并累加      while(data_buf!='.')      temp=temp*10+(data_buf-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-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={      '$','G','P','G','G','A'};//要接收的GPS语句的ID内容    char val={      '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={      '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={      '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={      '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={      '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 发表于 2017-1-17 13:32:10

想试着改下楼主代码格式,发现实在太麻烦,算了,楼主自己改吧。
页: [1]
查看完整版本: arduino读取gps信息