Bitte nicht zu laut lachen…
Ich kopier mir was zusammen, und schau ob es geht.
Aber so langsam verstehe ich schon ein bischen, was da passiert (oder auch nicht).
// A simple sketch to read GPS data and parse the $GPRMC string
// see http://www.ladyada.net/make/gpsshield for more info
#include <SoftwareSerial.h>
SoftwareSerial mySerial = SoftwareSerial(2, 3);
#define GPSRATE 9600
// GPS parser for 406a
#define BUFFSIZ 90 // plenty big
#define USERID 123456789
#define STATUS 0
char buffer[BUFFSIZ];
char *parseptr;
char buffidx;
int hour, minute, second, year, month, date; //char weil führende Nullen erhalten bleiben müssen
uint32_t tmp, tmp2, longitude, latitude,latitude2,longitude2;
uint8_t groundspeed, groundspeed2, trackangle, trackangle2,magdev;
int checksum;
char latdir, longdir, magdir;
char status;
void setup()
{
Serial.begin(38400);
mySerial.begin(GPSRATE);
// prints title with ending line break
Serial.println("GPS parser");
}
uint32_t parsedecimal(char *str) {
uint32_t d = 0;
while (str[0] != 0) {
if ((str[0] > '9') || (str[0] < '0'))
return d;
d *= 10;
d += str[0] - '0';
str++;
}
return d;
}
void loop()//###################
{
//Serial.print("\n\rread: ");
readline();
// check if $GPRMC (global positioning fixed data)
if (strncmp(buffer, "$GPRMC",6) == 0) {
Serial.println(buffer); // das ist der original Satz aus dem GPS
// hhmmss time data
parseptr = buffer+7;
tmp2 = parsedecimal(parseptr);
//Serial.print(tmp2/1);
//Serial.println(".000");
hour = tmp2 / 10000;
minute = (tmp2 / 100) % 100;
second = tmp2 % 100;
//Serial.println (second);
parseptr = strchr(parseptr, ',') + 1;
status = parseptr[0];
//Serial.println(status);
// grab latitude & long data
// latitude
parseptr = strchr(parseptr, ',') + 1;
latitude = parsedecimal(parseptr);
if (longitude != 0) {
latitude *= 10000;
parseptr = strchr(parseptr, '.')+1;
latitude += parsedecimal(parseptr);
}
//Serial.println(latitude);
// read latitude N/S data
parseptr = strchr(parseptr, ',') + 1;
if (parseptr[0] != ',') {
latdir = parseptr[0];
}
//Serial.println(latdir);
// longitude
parseptr = strchr(parseptr, ',')+1;
longitude = parsedecimal(parseptr);
if (longitude != 0) {
longitude *= 10000;
parseptr = strchr(parseptr, '.')+1;
longitude += parsedecimal(parseptr);
}
//Serial.println(longitude);
// read longitude E/W data
parseptr = strchr(parseptr, ',')+1;
if (parseptr[0] != ',') {
longdir = parseptr[0];
}
//Serial.println(longdir);
// groundspeed
parseptr = strchr(parseptr, ',')+1;
groundspeed = parsedecimal(parseptr);
parseptr = strchr(parseptr, '.')+1;
groundspeed2 = parsedecimal(parseptr);
//Serial.println(groundspeed);
// track angle ####################### geht nicht
parseptr = strchr(parseptr, ',')+1;
trackangle = parsedecimal(parseptr);
parseptr = strchr(parseptr, '.')+1;
trackangle2 = parsedecimal(parseptr);
//Serial.println(trackangle);
// date
parseptr = strchr(parseptr, ',')+1;
tmp = parsedecimal(parseptr);
date = tmp / 10000;
month = (tmp / 100) % 100;
year = tmp % 100;
//Serial.print(date);
//Serial.print(month);
//Serial.println(year);
// Magnetische Abweichung
parseptr = strchr(parseptr, ',')+1;
magdev = parsedecimal(parseptr);
//Serial.println(magdev);
// magnetische Richtung
parseptr = strchr(parseptr, ',')+1;
magdir = parsedecimal(parseptr);
//Serial.println(magdir);
// Checksum
parseptr = strchr(parseptr, ',')+1;
checksum = parsedecimal(parseptr);
//Serial.println(checksum);
QVPOS_Satz(); //Modulaufruf für QVPOS Datensatz
}
}
void readline(void) {//#######################################
char c;
buffidx = 0; // start at begninning
while (1) {
c=mySerial.read();
if (c == -1)
continue;
//Serial.print(c);
if (c == '\n')
continue;
if ((buffidx == BUFFSIZ-1) || (c == '\r')) {
buffer[buffidx] = 0;
return;
}
buffer[buffidx++]= c;
}
}
void QVPOS_Satz(){//###########################################
Serial.print("$QVPOS,");
Serial.print(USERID);
Serial.print(",");
Serial.print(STATUS);
Serial.print(",");
if (date<10){Serial.print("0");}//erzwingt führende Null
Serial.print(date, DEC);
if (month<10){Serial.print("0");}//erzwingt führende Null
Serial.print(month, DEC);
if (year<10){Serial.print("0");}//erzwingt führende Null
Serial.print(year, DEC);
Serial.print(",");
if (hour<10){Serial.print("0");}//erzwingt führende Null
Serial.print(hour, DEC);
if (minute<10){Serial.print("0");}//erzwingt führende Null
Serial.print(minute, DEC);
if (second<10){Serial.print("0");}//erzwingt führende Null
Serial.print(second, DEC);
Serial.print(",");
if (latdir == 'S')
Serial.print('-');
Serial.print(latitude); //Punkt auf sechste Stelle von Rechts / alles hinterm Punkt in DEC
Serial.print(",");
if (longdir == 'W')
Serial.print('-');
Serial.print(longitude); //Punkt auf sechste Stelle von Rechts / alles hinterm Punkt in DEC
Serial.print(",");
if (groundspeed2<10);{Serial.print("0");} //erzwingt führende Null
Serial.print (groundspeed2);
Serial.print(".");
if (groundspeed2<10)
Serial.print (groundspeed2);
Serial.print(",");
Serial.print(trackangle); //Fake Richtung
Serial.print(",");
Serial.print("0.00"); //Fake Höhe
Serial.println(Checksum,HEX); //geht nicht
}