W
Hallo Bernd,
Bei dem Input Deines Programms handelt es sich um ein NMEA 0183-Protokoll. Da gibt es eine Menge Dinge, die 'input-technisch' ein wenig knifflig sind.
Und es exisitert bereits eine in C geschrieben Lib, die Dir die einzelnen Pakete parsen kann. Ich habe mir das mal kurz angeschaut und finde sie recht ordentlich gemacht.
Entscheide Du Dich, ob das Programm in C oder C++ erstellt werden soll. Ich habe ein wenig experimentiert - hier ein (noch unvollendeter) Ausschnitt aus meinem Programmversuch, ein GGA-Paket zu parsen:
std::istream& operator>>( std::istream& in, GGA& gga )
{
char g;
return in >> gga.time >> comma >> geo_coordinate<'N','S'>(gga.latitude) >> comma >> geo_coordinate<'E','W'>(gga.longitude)
>> comma >> gga.qualifier_indicator >> comma >> gga.n_sats
>> comma >> gga.horizontal_dilution_of_precision >> comma >> gga.antenna_altitude >> comma >> g
>> comma >> gga.geoidal_separation >> comma >> g
>> comma >> opt(gga.age_of_differential_GPS_data=0) >> comma >> opt(gga.station_ID=0);
}
und das Pendat dazu aus der nmea-lib (Datei parse.c):
int nmea_parse_GPGGA(const char *buff, int buff_sz, nmeaGPGGA *pack)
{
char time_buff[NMEA_TIMEPARSE_BUF];
NMEA_ASSERT(buff && pack);
memset(pack, 0, sizeof(nmeaGPGGA));
nmea_trace_buff(buff, buff_sz);
if(14 != nmea_scanf(buff, buff_sz,
"$GPGGA,%s,%f,%C,%f,%C,%d,%d,%f,%f,%C,%f,%C,%f,%d*",
&(time_buff[0]),
&(pack->lat), &(pack->ns), &(pack->lon), &(pack->ew),
&(pack->sig), &(pack->satinuse), &(pack->HDOP), &(pack->elv), &(pack->elv_units),
&(pack->diff), &(pack->diff_units), &(pack->dgps_age), &(pack->dgps_sid)))
{
nmea_error("GPGGA parse error!");
return 0;
}
if(0 != _nmea_parse_time(&time_buff[0], (int)strlen(&time_buff[0]), &(pack->utc)))
{
nmea_error("GPGGA time parse error!");
return 0;
}
return 1;
}
Der Autor der nmea-lib hat sich ein eigens scanf (' nmea_scanf ' s.o.) geschrieben. In C++ habe ich das mit einigen Manipulatoren wie z.B.: comma , geo_coordinate und opt gelöst.
Falls Du Dich für C++ entscheidest, werde ich versuchen Dir zu erklären, wie das geht.
Bis dann & Gruß
Werner