GPGGA Parsing using Adafruit GPS logger shield kit

Hello everybody, I have few coding experience, and I am having trouble parsing string data and storing them into variables in a code based off the laydada website. I am attempting to create variables for Latitude, Longitute, and Altitude from the GPGGA NMEA sentence .I do not clearly understand how to parse a comma seperated string, let alone a simple string, even after looking at the simple examples in the arduino IDE. This is for a Weather balloon project.The code is very new to me, and I want to learn and understand whats going on. This is an example of the GPGGA string I get:
$GPGGA,204643.000,3347.2269,N,11623.5715,W,2,08,1.1,97.9,M,-32.3,M,1.8,0000*70

I understand how to read the string, such as the value 3347.2269 it Latitude, 11623.5715 is Longitude, and 97.7 is the altitude. I do not understand how to parse the string, and embed the values into the variables "latitude, longitude, and altitude.

I am attempting to store the numbers in variables to send them to a Radio Shield that will allow us to transmit the coordinates to the ground.
A hand in the right direction would be greatly appreciated. I am attaching the code I am working with, along with the link to the GPS shield.

// Ladyada's logger modified by Bill Greiman to use the SdFat library

// this is a generic logger that does checksum testing so the data written should be always good
// Assumes a sirf III chipset logger attached to pin 2 and 3

#include <SD.h>
#include <avr/sleep.h>
#include "GPSconfig.h"


#if ARDUINO >= 100
 #include <SoftwareSerial.h>
#else
 #include <NewSoftSerial.h>
#endif

// power saving modes
#define SLEEPDELAY 0 /* power-down time in seconds. Max 65535. Ignored if TURNOFFGPS == 0 */
#define TURNOFFGPS 0 /* set to 1 to enable powerdown of arduino and GPS. Ignored if SLEEPDELAY == 0 */
#define LOG_RMC_FIXONLY 0 /* set to 1 to only log to SD when GPD has a fix */
//#define GGA_ON"$PSRF103,0,1,1,1*25\R\N"
// what to log
#define LOG_RMC 0 // RMC-Recommended Minimum Specific GNSS Data, message 103,04
#define LOG_GGA 1 // GGA-Global Positioning System Fixed Data, message 103,00
#define LOG_GLL 0 // GLL-Geographic Position-Latitude/Longitude, message 103,01
#define LOG_GSA 0 // GSA-GNSS DOP and Active Satellites, message 103,02
#define LOG_GSV 0 // GSV-GNSS Satellites in View, message 103,03
#define LOG_VTG 0 // VTG-Course Over Ground and Ground Speed, message 103,05



// Use pins 2 and 3 to talk to the GPS. 2 is the TX pin, 3 is the RX pin
#if ARDUINO >= 100
 SoftwareSerial gpsSerial = SoftwareSerial(2, 3);
#else
 NewSoftSerial gpsSerial = NewSoftSerial(2, 3);
#endif
#define GPSRATE 4800

// Set the pins used
#define powerPin 4
#define led1Pin 5
#define led2Pin 6
#define chipSelect 10

#define BUFFSIZE 90
char buffer[BUFFSIZE];
uint8_t bufferidx = 0;
bool fix = false; // current fix data
bool gotGPRMC; //true if current data is a GPRMC strinng
uint8_t i;
File logfile;

unsigned long latitude, longitude, altitude;


// read a Hex value and return the decimal equivalent
uint8_t parseHex(char c) {
  if (c < '0')
    return 0;
  if (c <= '9')
    return c - '0';
  if (c < 'A')
    return 0;
  if (c <= 'F')
    return (c - 'A')+10;
}

// blink out an error code
void error(uint8_t errno) {
/*
if (SD.errorCode()) {
putstring("SD error: ");
Serial.print(card.errorCode(), HEX);
Serial.print(',');
Serial.println(card.errorData(), HEX);
}
*/
  while(1) {
    for (i=0; i<errno; i++) {
      digitalWrite(led1Pin, HIGH);
      digitalWrite(led2Pin, HIGH);
      delay(100);
      digitalWrite(led1Pin, LOW);
      digitalWrite(led2Pin, LOW);
      delay(100);
    }
    for (; i<10; i++) {
      delay(200);
    }
  }
}
void setup() {
  WDTCSR |= (1 << WDCE) | (1 << WDE);
  WDTCSR = 0;
  Serial.begin(9600);
  Serial.println("\r\nGPSlogger");
  pinMode(led1Pin, OUTPUT);
  pinMode(led2Pin, OUTPUT);
  pinMode(powerPin, OUTPUT);
  digitalWrite(powerPin, LOW);

  pinMode(10, OUTPUT);
  
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card init. failed!");
    error(1);
  }

  strcpy(buffer, "GPSLOG00.TXT");
  for (i = 0; i < 100; i++) {
    buffer[6] = '0' + i/10;
    buffer[7] = '0' + i%10;
    // create if does not exist, do not open existing, write, sync after write
    if (! SD.exists(buffer)) {
      break;
    }
  }

  logfile = SD.open(buffer, FILE_WRITE);
  if( ! logfile ) {
    Serial.print("Couldnt create "); Serial.println(buffer);
    error(3);
  }
  Serial.print("Writing to "); Serial.println(buffer);
  
  // connect to the GPS at the desired rate
  gpsSerial.begin(GPSRATE);
  
  Serial.println("Ready!");
  
  gpsSerial.print(SERIAL_SET);
  delay(250);

#if (LOG_DDM == 1)
     gpsSerial.print(DDM_ON);
#else
     gpsSerial.print(DDM_OFF);
#endif
  delay(250);
#if (LOG_GGA == 1)
    gpsSerial.print(GGA_ON);
#else
    gpsSerial.print(GGA_OFF);
#endif
  delay(250);
#if (LOG_GLL == 1)
    gpsSerial.print(GLL_ON);
#else
    gpsSerial.print(GLL_OFF);
#endif
  delay(250);
#if (LOG_GSA == 1)
    gpsSerial.print(GSA_ON);
#else
    gpsSerial.print(GSA_OFF);
#endif
  delay(250);
#if (LOG_GSV == 1)
    gpsSerial.print(GSV_ON);
#else
    gpsSerial.print(GSV_OFF);
#endif
  delay(250);
#if (LOG_RMC == 1)
    gpsSerial.print(RMC_ON);
#else
    gpsSerial.print(RMC_OFF);
#endif
  delay(250);

#if (LOG_VTG == 1)
    gpsSerial.print(VTG_ON);
#else
    gpsSerial.print(VTG_OFF);
#endif
  delay(250);

#if (USE_WAAS == 1)
    gpsSerial.print(WAAS_ON);
#else
    gpsSerial.print(WAAS_OFF);
#endif
}

void loop() {
  char c;
  uint8_t sum;

  // read one 'line'
  if (gpsSerial.available()) {
    c = gpsSerial.read();
#if ARDUINO >= 100
    //Serial.write(c);
#else
    //Serial.print(c, BYTE);
#endif
    if (bufferidx == 0) {
      while (c != '

Everything works in the code, including the writing to the SDcard.)
       c = gpsSerial.read(); // wait till we get a $
   }
   buffer[bufferidx] = c;

#if ARDUINO >= 100
   //Serial.write(c);
#else
   //Serial.print(c, BYTE);
#endif
   if (c == ‘\n’) {
     //putstring_nl(“EOL”);
     //Serial.print(buffer);
     buffer[bufferidx+1] = 0; // terminate it

if (buffer[bufferidx-4] != ‘’) {
       // no checksum?
       Serial.print(’
’);
       bufferidx = 0;
       return;
     }
     // get checksum
     sum = parseHex(buffer[bufferidx-3]) * 16;
     sum += parseHex(buffer[bufferidx-2]);

// check checksum
     for (i=1; i < (bufferidx-4); i++) {
       sum ^= buffer[i];
     }
     if (sum != 0) {
       //putstring_nl(“Cxsum mismatch”);
       Serial.print(’~’);
       bufferidx = 0;
       return;
     }
     // got good data!

gotGPRMC = strstr(buffer, “GPGGA”); //edit
     if (gotGPRMC) {                    
       // find out if we got a fix
       char *p = buffer;
       p = strchr(p, ‘,’)+1;
       p = strchr(p, ‘,’)+1; // skip to 3rd item
       
       if (p[0] == ‘V’) {
         digitalWrite(led1Pin, LOW);
         fix = false;
       } else {
         digitalWrite(led1Pin, HIGH);
         fix = true;
       }
     }
     if (LOG_RMC_FIXONLY) {
       if (!fix) {
         Serial.print(’_’);
         bufferidx = 0;
         return;
       }
     }
     // rad. lets log it!
     
     Serial.print(buffer); //first, write it to the serial monitor
     Serial.print(’#’);
     
     if (gotGPRMC) //If we have a GPRMC string
     {
       // Bill Greiman - need to write bufferidx + 1 bytes to getCR/LF
       bufferidx++;

digitalWrite(led2Pin, HIGH); // Turn on LED 2 (indicates write to SD)

logfile.write((uint8_t ) buffer, bufferidx); //write the string to the SD file
       logfile.flush();
       /

if( != bufferidx) {
putstring_nl(“can’t write!”);
error(4);
}
*/

digitalWrite(led2Pin, LOW); //turn off LED2 (write to SD is finished)

bufferidx = 0; //reset buffer pointer

if (fix) { //(don’t sleep if there’s no fix)
         
         if ((TURNOFFGPS) && (SLEEPDELAY)) { // turn off GPS module?
         
           digitalWrite(powerPin, HIGH); //turn off GPS

delay(100); //wait for serial monitor write to finish
         //  sleep_sec(SLEEPDELAY); //turn off CPU
 
           digitalWrite(powerPin, LOW); //turn on GPS
         } //if (TURNOFFGPS)
       
       } //if (fix)
       
       return;
     }//if (gotGPRMC)
     
   }
   bufferidx++;
   if (bufferidx == BUFFSIZE-1) {
      Serial.print(’!’);
      bufferidx = 0;
   }
 } else {

}

}

void sleep_sec(uint16_t x) {
 while (x–) {
    // set the WDT to wake us up!
   WDTCSR |= (1 << WDCE) | (1 << WDE); // enable watchdog & enable changing it
   WDTCSR = (1<< WDE) | (1 <<WDP2) | (1 << WDP1);
   WDTCSR |= (1<< WDIE);
   set_sleep_mode(SLEEP_MODE_PWR_DOWN);
// sleep_enable();
   sleep_mode();
// sleep_disable();
 }
}

SIGNAL(WDT_vect) {
 WDTCSR |= (1 << WDCE) | (1 << WDE);
 WDTCSR = 0;
}

/* End code */


Everything works in the code, including the writing to the SDcard.

I have tried using TinyGPS, but have very few ideas of how to use it correctly.

That library comes with examples. It appears you haven’t even looked at them.

You didn’t read the sticky on properly posting in the programming section, or your code wouldn’t look like that mess.

If you can’t be bothered reading that post, why should we be bothered reading yours? Fix yours, and I’ll have a look at it again.

A good post in this forum says more than “I’m having trouble”. It explains precisely what the trouble is, or it says “I don’t know how to…”.

Forgive me for not being familiar with the form.Thanks for the heads up. I didn't install the library correctly and I'm experiment with the examples as we speak. I will repost if I found the solution.

Here i am attaching simple code , Where you can parse data from NMEA string

here i am seprating: latitude. longitude, date,time

If you need any data you need to modify the code

main_c.rar (1.5 KB)