kosma / minmea

a lightweight GPS NMEA 0183 parser library in pure C
Do What The F*ck You Want To Public License
773 stars 250 forks source link

gps data error #77

Closed FangXS-github closed 8 months ago

FangXS-github commented 8 months ago

When I use Minmea on MCU, there is an error in obtaining data when the GPS module is not fully prepared (it takes 5-10 minutes to prepare for the first power on); such as input: $GNVTG,,,,,,,,,N*2E and via minmea output: $xxVTG: true track degrees = 510423550381407680000000000000000000000.000000 magnetic track degrees = 510423550381407680000000000000000000000.000000 speed knots = 510423550381407680000000000000000000000.000000 speed kph = 510423550381407680000000000000000000000.000000

kosma commented 8 months ago

Please show your code. In general, You should be checking the .scale member of the returned structures - if zero, the values are not valid.

FangXS-github commented 8 months ago

i used ur example code, do not add any check now, I will add validation code,thanks :

 enum minmea_sentence_id id = minmea_sentence_id(gps_data_array, false);
    switch (id) {
        case MINMEA_SENTENCE_RMC: {
            struct minmea_sentence_rmc frame;
            if (minmea_parse_rmc(&frame, gps_data_array)) {
                gps_info( "$xxRMC: raw coordinates and speed: (%d/%d,%d/%d) %d/%d\n",
                        frame.latitude.value, frame.latitude.scale,
                        frame.longitude.value, frame.longitude.scale,
                        frame.speed.value, frame.speed.scale);
                gps_info( "$xxRMC fixed-point coordinates and speed scaled to three decimal places: (%d,%d) %d\n",
                        minmea_rescale(&frame.latitude, 1000),
                        minmea_rescale(&frame.longitude, 1000),
                        minmea_rescale(&frame.speed, 1000));
                gps_info( "$xxRMC floating point degree coordinates and speed: (%f,%f) %f\n",
                        minmea_tocoord(&frame.latitude),
                        minmea_tocoord(&frame.longitude),
                        minmea_tofloat(&frame.speed));
            }
            else {
                gps_info( "$xxRMC sentence is not parsed\n");
            }
        } break;

        case MINMEA_SENTENCE_GGA: {
            struct minmea_sentence_gga frame;
            if (minmea_parse_gga(&frame, gps_data_array)) {
                gps_info( "$xxGGA: fix quality: %d\n", frame.fix_quality);
            }
            else {
                gps_info( "$xxGGA sentence is not parsed\n");
            }
        } break;

        case MINMEA_SENTENCE_VTG: {
            struct minmea_sentence_vtg frame;
            if (minmea_parse_vtg(&frame, gps_data_array)) {
                gps_info( "$xxVTG: true track degrees = %f\n",
                        minmea_tofloat(&frame.true_track_degrees));
                gps_info( "        magnetic track degrees = %f\n",
                        minmea_tofloat(&frame.magnetic_track_degrees));
                gps_info( "        speed kph = %f\n",
                        minmea_tofloat(&frame.speed_kph));
            }
            else {
                gps_info( "$xxVTG sentence is not parsed\n");
            }
        } break;

        case MINMEA_SENTENCE_ZDA: {
            struct minmea_sentence_zda frame;
            if (minmea_parse_zda(&frame, gps_data_array)) {
                gps_info( "$xxZDA: %d:%d:%d %02d.%02d.%d UTC%+03d:%02d\n",
                        frame.time.hours,
                        frame.time.minutes,
                        frame.time.seconds,
                        frame.date.day,
                        frame.date.month,
                        frame.date.year,
                        frame.hour_offset,
                        frame.minute_offset);
            }
            else {
                gps_info( "$xxZDA sentence is not parsed\n");
            }
        } break;

        case MINMEA_INVALID: {
            gps_info( "$xxxxx sentence is not valid\n");
        } break;

        default: {
            gps_info( "$xxxxx sentence is not parsed\n");
        } break;
    }
FangXS-github commented 8 months ago

thanks, solved..

kosma commented 8 months ago

I will work on improving the example - it should indeed check those!

FangXS-github commented 8 months ago

:smile: :+1: