Hi, I'm new to this fourm I want to ask if anyone can help.I have a program for a GPS receiver it is in C ,for testing I assume the string of GPS message, it doesn't have any errors but it didn't run I don't know why. I used the ICC11 compiler.
#include < stdio.h >
#include < ctype.h >
#include < stdlib.h >
#include < string.h >
#include < math.h >
#define MAXSIZE 100
// char read from COM port
char charRead[13];
charRead[0]='$GPRMC';
charRead[1]='123519';
charRead[2]='A';
charRead[3]='4807.038';
charRead[4]='N';
charRead[5]='01131.000';
charRead[6]='E';
charRead[7]='022.4';
charRead[8]='084.4';
charRead[9]='230394';
charRead[10]='003.1';
charRead[11]='W*6A';
charRead[12]='\0';
//unsigned char SC0DR;
// Buffer collects chars read from GPS
unsigned char stringRead[MAXSIZE];
// Set an array for each attribute
unsigned char tempString[MAXSIZE];
unsigned char timeString[12];
unsigned char latitudeString[11];
unsigned char latitudeCardinalString[3];
unsigned char longitudeString[12];
unsigned char longitudeCardinalString[3];
unsigned char speedString[11];
unsigned char dateString[11];
// Declare pointer
unsigned char *pChar;
// Coordinated Universal Time(GMT) & Eastern Standard time
unsigned long utcTime, estTime;
unsigned long utcHour, estHour;
unsigned long utcMinutes, estMinutes;
unsigned long utcSeconds, estSeconds;
unsigned long date;
unsigned long day,month,year;
// Sets the last comma position
unsigned char lastCommaPosition;
// Sets the Latitude & Longitude
float latitude;
int latDegrees;
float latMinutes;
float longitude;
int longDegrees;
float longMinutes;
float speed;
// dummy variable
unsigned int j, k;
// Number of chars read per GPS message string
unsigned int i;
// Number of GPS strings read
unsigned int numLinesRead;
// initializing the serial ports SCI0 & SCI1
// Enter a loop for reading char from serial port(Data Reg.)
//do {
void main(void){
// checks if GPS messages start with $ char
#if charRead=='$'
i = 0;
numLinesRead++;
stringRead = charRead; /* include each char read to the array
/* By this point, a complete GPS string has been read so save it /* Append the null terminator to the string read */
stringRead[i+1] = '\0';
/* Analyze string that we collected */
j = 0;
pChar = stringRead; /* put a pointer for the stringRead array*/
while(*(pChar+j) != COMMA) { /* COMMA 0x2C */
tempString[j] = *(pChar+j); /*store the string before the comma */
j++;
}
tempString[j] = '\0'; /* append the null to the end
/* Check if string we collected is the $GPRMC message */
#if tempString[3] == 'R' && tempString[4] == 'M' && tempString[5] == 'C'
/* Found GPRMC string. It has 11 commas total. Its NMEA sentence structure is:
$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
Where:
RMC Recommended Minimum sentence C
123519 Fix taken at 12:35:19 UTC
A Status A=active or V=Void.
4807.038,N Latitude 48 deg 07.038' N
01131.000,E Longitude 11 deg 31.000' E
022.4 Speed over the ground in knots
084.4 Track angle in degrees True
230394 Date - 23rd of March 1994
003.1,W Magnetic Variation
*6A The checksum data, always begins with *
*/
pChar = stringRead; /* pointer to the String read
/* Get UTC time */
j = 7; /* start of time field */
k = 0;
while(*(pChar+j) != COMMA) { //loop until a comma is found
timeString[k] = *(pChar+j); //save in the time string
j++;
k++;
}
lastCommaPosition = j; // save the position of the last comma
timeString[k] = '\0'; // append the null to the end
sscanf(timeString, "%ld", &utcTime); //save the string to the variable
utcHour = (utcTime/10000); //extract Hours from long
utcMinutes = (utcTime - (utcHour*10000))/100; //extract minutes from long
utcSeconds = utcTime - (utcHour*10000) - (utcMinutes*100); /* extract seconds from long */
#if(utcHour >= 0 && utcHour <= 20)
estHour = utcHour + 3;
#endif
#elseif estHour = utcHour - 21;
estMinutes = utcMinutes;
estSeconds = utcSeconds;
#endelseif
/* Get lattitude: ddmm.mmmm */
pChar = stringRead;
j = lastCommaPosition + 1; //start from the next comma
k = 0;
while(*(pChar+j) != COMMA) {
latitudeString[k] = *(pChar+j); //save in the latitude string
j++;
k++;
}
lastCommaPosition = j;
latitudeString[k] = '\0';
sscanf(latitudeString, "%f", &latitude);
latDegrees = (int)(latitude/100);
latMinutes = (float)(latitude - latDegrees*100);
/* Get lattitude Cardinal direction */
pChar = stringRead;
j = lastCommaPosition + 1;
k = 0;
while(*(pChar+j) != COMMA) {
latitudeCardinalString[k] = *(pChar+j);
j++;
k++;
}
lastCommaPosition = j;
latitudeCardinalString[k] = '\0';
/* Get longitude: dddmm.mmmm */
pChar = stringRead;
j = lastCommaPosition + 1;
k = 0;
while(*(pChar+j) != COMMA) {
longitudeString[k] = *(pChar+j);
j++;
k++;
}
lastCommaPosition = j;
longitudeString[k] = '\0';
sscanf(longitudeString, "%f", &longitude);
longDegrees = (int)(longitude/100);
longMinutes = (float)(longitude - longDegrees*100);
/* Get Speed in Knots */
pChar = stringRead;
j = lastCommaPosition + 1;
k = 0;
while(*(pChar+j) != COMMA) {
speedString[k] = *(pChar+j);
j++;
k++;
}
lastCommaPosition = j;
speedString[k] = '\0';
sscanf(speedString, "%f", &speed);
speed = speed * 1.852;
/* Get date */
pChar = stringRead;
j = lastCommaPosition + 2; // skip the Track angle
k = 0;
while(*(pChar+j) != COMMA) {
dateString[k] = *(pChar+j);
j++;
k++;
}
lastCommaPosition = j;
dateString[k] = '\0';
sscanf(dateString, "%ld", &date);
day = (date/10000); //extract day from long
month = (date - (day*10000))/100; // extract month from long
year = date - (day*10000) - (month*100); // extract year from long
//else not a GPRMC sentence
#endif
// otherwise not a $ character... so loop back until one arrives
#endif
// } while(1);
printf("The Result ....\n");
printf("%02ld:%02ld:%02ld UTC = %02ld:%02ld:%02ld EST", utcHour, utcMinutes, utcSeconds, estHour, estMinutes, estSeconds);
printf("\t%02d DEG\t%2.4f MIN", latDegrees, latMinutes);
printf(" %s", latitudeCardinalString);
printf("\t%03d DEG\t%2.4f MIN", longDegrees, longMinutes);
} /* end of main */