Receiving weird Lat/Long readings

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,

Yes, the numbers are completely stable when the GPS is left in a fixed position. However, the readings do change when the GPS is not in a fixed position, i.e. moving around. So do you think that I'm not interpreting the data correctly?

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('"');

Is it safe to assume you got the coordinates while at Surrey Circle? If so you're not reading the format correctly. The coordinates actually read like this...32 51.7759,-96 49.2354 paste this data into google maps and it will plot the address.

hahaha well you would be correct. Thank you

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('"');
highlighted # is one zero short thanks wayneft

have an idea on how to rewrite the code for this adjustment?