Just unboxed the em406 today. Tried to hook it up using a sketch I've had. For some odd reason my latitude and longitude readings are way off, Might be garbage but idk...
here is the code.
#include <NewSoftSerial.h>
NewSoftSerial mySerial = NewSoftSerial(2, 3);
#define powerpin 4
#define GPSRATE 4800
#define BUFFSIZ 90
char buffer[BUFFSIZ];
char *parseptr;
char buffidx;
uint8_t hour, minute, second, year, month, date;
uint32_t latitude, longitude;
uint8_t groundspeed, trackangle;
char latdir, longdir;
char status;
void setup()
{
if (powerpin) {
pinMode(powerpin, OUTPUT);
}
pinMode(13, OUTPUT);
Serial.begin(GPSRATE);
mySerial.begin(GPSRATE);
Serial.println("GPS parser");
digitalWrite(powerpin, LOW); // pull low to turn on!
}
void loop()
{
uint32_t tmp;
Serial.print("\n\rread: ");
readline();
if (strncmp(buffer, "$GPRMC",6) == 0) {
parseptr = buffer+7;
tmp = parsedecimal(parseptr);
hour = tmp / 10000;
minute = (tmp / 100) % 100;
second = tmp % 100;
parseptr = strchr(parseptr, ',') + 1;
status = parseptr[0];
parseptr += 2;
latitude = parsedecimal(parseptr);
if (latitude != 0) {
latitude *= 10000;
parseptr = strchr(parseptr, '.')+1;
latitude += parsedecimal(parseptr);
}
parseptr = strchr(parseptr, ',') + 1;
if (parseptr[0] != ',') {
latdir = parseptr[0];
}
parseptr = strchr(parseptr, ',')+1;
longitude = parsedecimal(parseptr);
if (longitude != 0) {
longitude *= 10000;
parseptr = strchr(parseptr, '.')+1;
longitude += parsedecimal(parseptr);
}
parseptr = strchr(parseptr, ',')+1;
if (parseptr[0] != ',') {
longdir = parseptr[0];
}
parseptr = strchr(parseptr, ',')+1;
groundspeed = parsedecimal(parseptr);
parseptr = strchr(parseptr, ',')+1;
trackangle = parsedecimal(parseptr);
parseptr = strchr(parseptr, ',')+1;
tmp = parsedecimal(parseptr);
date = tmp / 10000;
month = (tmp / 100) % 100;
year = tmp % 100;
Serial.println();
Serial.print("Lat: ");
if (latdir == 'N')
Serial.print('+');
else if (latdir == 'S')
Serial.print('-');
Serial.print(latitude/1000000, DEC);
Serial.print('\°', BYTE);
Serial.print(' ');
Serial.print((latitude/10000)%100, DEC);
Serial.print('\'');
Serial.print(' ');
Serial.print((latitude%10000)*6/1000, DEC);
Serial.print('.');
Serial.print(((latitude%10000)*6/10)%100, DEC);
Serial.println('"');
Serial.print("Long: ");
if (longdir == 'E')
Serial.print('+');
else if (longdir == 'W')
Serial.print('-');
Serial.print(longitude/1000000, DEC);
Serial.print('\°', BYTE);
Serial.print(' ');
Serial.print((longitude/10000)%100, DEC);
Serial.print('\'');
Serial.print(' ');
Serial.print((longitude%10000)*6/1000, DEC);
Serial.print('.');
Serial.print(((longitude%10000)*6/10)%100, DEC);
Serial.println('"');
}
}
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 readline(void) {
char c;
buffidx = 0;
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;
}
}
This is what I have been receiving:
read:
$GPGGA,210042.159,3251.7759,N,09649.2354,W,1,03,3.8,173.5,M,-23.9,M,,0000*60
read:
$GPGSA,A,2,16,13,23,,,,,,,,,,3.9,3.8,1.0*37
read:
$GPRMC,210042.159,A,3251.7759,N,09649.2354,W,0.12,115.35,070610,,*12
Lat: +320 51' 46.55"
Long: -960 49' 14.12" these readings dont make since
Thanks in advance,