概述
代码来自多个部分,不一一引用。仅供参考。
GNGGA信息解析
char msg_line[600];
char read;
int i = 0;
void setup() {
// put your setup code here, to run once:
Serial1.begin(38400);
Serial.begin(38400);
}
void loop() {
// put your main code here, to run repeatedly:
if (Serial1.available()) {
//Serial.print((char)Serial1.read());
msg_line[i++] = (char)Serial1.read(); // read each character into the list
//Serial.print(msg_line[i]);
if(i >= 580) {
int ii = 0;
while(ii<i){
if(ii+20 < 600 && msg_line[ii] == 'G' && msg_line[ii+1] == 'A'){
//对GA那一行进行提取
int t = ii;
while(t<ii+73){
Serial.print(msg_line[t]);
t++;}//print info
}
ii++;
}
memset(msg_line, 0, 600);
i = 0;} //clear info
//Serial.print((char)Serial1.read());
}
}
GGA提取
#define GPSMAX 670
//GPS数据读取一次获得长度
#define GGA 70
//GGA长度
#define READBEGIN
600
//开始提取GPS长度
char gpsdata[GPSMAX];
//GPS数据提取
char read;
char gpsread[GGA];
//提取的GPS字符串
void GPSread()
//GPS数据读取
{
int kk = 0;
if (gpsSerial.available()) {
gpsdata[i++] = (char)gpsSerial.read();
//读取每一个元素
if(i >= READBEGIN) {
int ii = 0;
while(ii < i){
if(ii+GPSMAX-READBEGIN < GPSMAX && gpsdata[ii] == 'G' && gpsdata[ii+1] == 'G' && gpsdata[ii+2] == 'A'){
//对GGA那一行进行提取
int tt = ii;
while(gpsdata[tt] != 'n'){
gpsread[kk++] = gpsdata[tt];
//Serial.print(gpsdata[tt]);
//输出提取的GPS数据
tt++;
}
gpsread[kk+1] = 'n';
Serial.print('n');
}
ii++;
}
memset(gpsdata, 0, GPSMAX);
i = 0;
} //clear info
}
}
下面GNGGA 提取代码,问题在于:如何从串口流里面提取到GNGGA 完整语句。。。
#include <SoftwareSerial.h>
SoftwareSerial ss(4, 3);
// RX,TX
// 变量声明
String gngga = "";
// 读取到的GNGGA信息
String info[15];
// 用字符数组存储
int commaPosition = -1;
//函数声明
String getTime(); // 获取北京时间
String getLat(); // 获取纬度dd.mmssss
String getLng(); // 获取经度dd.mmssss
String getStatus(); // 获取当前定位状态,0=未定位,1 = 非差分定位,2=差分定位
void setup() {
Serial.begin(9600);
ss.begin(9600);
}
void loop() {
gngga = "";
while (ss.available() > 0) {
gngga += char(ss.read());
delay(10);
// 延时,不延时的话就会跳出while循环
}
if (gngga.length() > 0) {
//Serial.println(gngga);
//在这里进行数据的解析
for (int i = 0; i < 15; i++) {
commaPosition = gngga.indexOf(',');
if (commaPosition != -1)
{
//Serial.println(gngga.substring(0, commaPosition));
info[i] = gngga.substring(0, commaPosition);
gngga = gngga.substring(commaPosition + 1, gngga.length());
}
else {
if (gngga.length() > 0) {
// 最后一个会执行这个
info[i] = gngga.substring(0, commaPosition);
//Serial.println(gngga);
}
}
}
Serial.println("time: " + getTime());
Serial.println("lat: " + getLat());
Serial.println("lng: " + getLng());
Serial.println("status: " + getStatus());
}
}
String getTime(){
return info[1];
}
String getLat(){
return info[2];
}
String getLng(){
return info[4];
}
String getStatus(){
return info[6];
}
提供一种思路:
#include <avr/wdt.h>
#include <LiquidCrystal.h>
#include <Adafruit_GPS.h>
#include <Arduino.h>
Adafruit_GPS GPS(&Serial3); //Create GPS object
LiquidCrystal lcd(12,11, 10, 9, 8, 7, 6, 5, 4, 3, 2);
boolean flag = false;
void setup() {
wdt_enable(WDTO_2S);
pinMode(13,OUTPUT);
lcd.begin(16,2);
GPS.begin(9600);
//Turn GPS on at baud rate of 9600
lcd.begin(16,2);
// columns, rows.
use 16,2 for a 16x2 LCD, etc.
lcd.clear();
// start with a blank screen
lcd.setCursor(0,0);
// set cursor to column 0, row 0 (the first row)
lcd.print("Waiting for the");
// change this text to whatever you like. keep it clean.
lcd.setCursor(0,1);
// set cursor to column 0, row 1
lcd.print("
satellites!");
}
char NMEA2[30];//30 is enough for time
void loop() {
while(!GPS.newNMEAreceived()) { //Keep reading characters in this loop until a good NMEA sentence is received
GPS.read(); //read a character from the GPS
}
GPS.parse(GPS.lastNMEA());
//Once you get a good NMEA, parse it
String NMEA1 = GPS.lastNMEA();
//Once parsed, save NMEA sentence into NMEA1
NMEA1.trim();
if(!flag)
//if interruput not acitive, then write new value.
NMEA1.toCharArray(NMEA2,30);
light();
delay(250);
}
void show(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("
");
lcd.print(NMEA2[24]);//print year
lcd.print(NMEA2[25]);
lcd.print(NMEA2[26]);
lcd.print(NMEA2[27]);
lcd.print(".");
lcd.print(NMEA2[21]);//print month
lcd.print(NMEA2[22]);
lcd.print(".");
lcd.print(NMEA2[18]);//print day
lcd.print(NMEA2[19]);
lcd.setCursor(0,1);
lcd.print("
");
lcd.print(NMEA2[7]);//print hour
lcd.print(NMEA2[8]);
lcd.print(":");
lcd.print(NMEA2[9]);//print minute
lcd.print(NMEA2[10]);
lcd.print(":");
lcd.print(NMEA2[11]);//print second
lcd.print(NMEA2[12]);
lcd.print("
UTC");
}
void light(){
wdt_reset();
flag = true;
digitalWrite(13, HIGH);
if(NMEA2[0] == '$' && NMEA2[3]=='Z' && NMEA2[4]=='D' && NMEA2[5] == 'A' ){//if ZDA sentence
if(NMEA2[7] == ','){ //this means gps haven't get the time
lcd.clear();
lcd.setCursor(0,0);
// set cursor to column 0, row 0 (the first row)
lcd.print("Waiting for the");
// change this text to whatever you like. keep it clean.
lcd.setCursor(0,1);
// set cursor to column 0, row 1
lcd.print("
satellite!");
//little change to show gps is working but not get time yet
flag = false;
return;
}
show();
}
digitalWrite(13, LOW);
flag = false;
}
最后
以上就是怕孤独蜜粉为你收集整理的Arduino GPS 解析的全部内容,希望文章能够帮你解决Arduino GPS 解析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复