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端。
漏主,把代码也编辑一下
楼主您好,sim908模块的使用需要注意三个问题
1.开关是否按照wiki拨动
2.置于室外2-5分钟才会有数据输出
3.可以尝试外部供电 想试着改下楼主代码格式,发现实在太麻烦,算了,楼主自己改吧。
页:
[1]