17309| 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端。 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed