I am writing a NMEA parser in C these days. To be specific, this is for ATMega16. This NMEA parser is a unit of a system I am trying to build. I just need some ideas and need to verify my approach (if it is good considering the embedded systems). I hope advices from people.

nmea.h header file
Code: Select all
//#include "buffer.h"
#include<stdio.h>
/*void init_NMEA_Engine();*/
void parseNMEA();
void processGGA();
void processGLL();
void processVTG();
char readFromBuffer();
void readNextParameter(char* store);
void zeroFillArray(char* array,short size);
char tempBuffer[15];//Temporarily hold parameters
char longitude[10];
char lattitude[10];
char lon_; // N, S
char lat_;// E,W
char utcTime[10];
short fixMode; //false- no fix, true-valid fix
short satsUsed;
float MSL_Altitude;
short course;
short speed;
short day;
short month;
short year;
Code: Select all
#include "nmea.h"
#include<stdlib.h>
#include<string.h>
char nmea1[]="$GPGGA,161229.487,8.425838,N,82.538363,E,1,07,1.0,9.0,M, , , ,0000*18\r\n";
int j=0;
//Just for debugging the parser
char readFromBuffer(){
return nmea1[j++];
}
void readNextParameter(char* store){
char temp;
while((temp=readFromBuffer())!=',') *store++=temp;
}
void parseNMEA(){
char temp;
char sentenceType[5];//MSG ID is exactly 5 characters long
while((temp=readFromBuffer())!='$');//Seek $ then exit loop and execute code below
//Read sentence type identifier
readNextParameter(&sentenceType);
if(strcmp(sentenceType,"GPGGA")){
processGGA();
}else if(strcmp(sentenceType,"GPGLL")){
processGLL();
}else if(strcmp(sentenceType,"GPVTG")){
processVTG();
}
}
void zeroFillArray(char* array,short size){
for(int i=0;i<size;i++) *array++=0;
}
void processGGA(){
char temp;
short i=0;
zeroFillArray(&utcTime,15);
readNextParameter(&utcTime);
zeroFillArray(&lattitude,10);
readNextParameter(&lattitude);
readNextParameter(&lat_);//N,S indicator
zeroFillArray(&longitude,10);
readNextParameter(&longitude);
readNextParameter(&lon_);// E,W indicator
readNextParameter(&temp);
fixMode=atoi(temp); //Position validity
readNextParameter(&temp);
satsUsed=atoi(temp);
readNextParameter(&temp); //skip HDOP
zeroFillArray(&tempBuffer,15);
readNextParameter(&tempBuffer);
MSL_Altitude=atof(tempBuffer);
//discard all the others for now
}
void processGLL(){
}
void processVTG(){
}
Thanks