0

Ultimate GPS NMEA Output errors
Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.

Ultimate GPS NMEA Output errors

by krinilssen on Sat Sep 18, 2021 8:05 pm

I have been trying to use GSV NMEA sentences to produce a visual map of what satellites are over head. Randomly after just writing the parsing code for GSV I started receiving bad nmea sentences? I dont get any change when i try to change the output type as well. Not sure what is going on.

this is the output from running GPS_hardware_Serial_parsing with outputting last nmea sentence

Admin note: some characters in the pasted code below were causing issues on the board. They've been redacted for now. Thankfully the issue here seems to be resolved.

Code: Select all | TOGGLE FULL SIZE
Adafruit GPS library basic parsing test!

Time: 00:00:00.000
Date: 0/0/200
Fix: 0 quality: 0
[[[...snipped unicode characters...]]]


and this is the output when i have echo on:

Code: Select all | TOGGLE FULL SIZE
Adafruit GPS library basic parsing test!
b
Time: 00:00:00.000
Date: 0/0/200
Fix: 0 quality: 0
[[[...snipped unicode characters...]]]

krinilssen
 
Posts: 6
Joined: Thu Jun 04, 2020 6:30 pm

Re: Ultimate GPS NMEA Output errors

by franklin97355 on Sat Sep 18, 2021 10:04 pm

What speed and baud rate do you have set? When you do an echo of the output do you get valid output? Can you post a link to the code or post a copy of it?

franklin97355
 
Posts: 22253
Joined: Mon Apr 21, 2008 2:33 pm
Location: Lacomb, OR.

Re: Ultimate GPS NMEA Output errors

by krinilssen on Sun Sep 19, 2021 12:11 am

I have it set to 9600 for both. I have tried adding to the example below to also set it to check if that was the issue but either its not reading my commands as well or it isnt the issue.

This is the included example, GPS_HardwareSerial_parsing code that produced the outputs:

Code: Select all | TOGGLE FULL SIZE
// Test code for Ultimate GPS Using Hardware Serial (e.g. GPS Flora or FeatherWing)
//
// This code shows how to listen to the GPS module via polling. Best used with
// Feathers or Flora where you have hardware Serial and no interrupt
//
// Tested and works great with the Adafruit GPS FeatherWing
// ------> https://www.adafruit.com/products/3133
// or Flora GPS
// ------> https://www.adafruit.com/products/1059
// but also works with the shield, breakout
// ------> https://www.adafruit.com/products/1272
// ------> https://www.adafruit.com/products/746
//
// Pick one up today at the Adafruit electronics shop
// and help support open source hardware & software! -ada

#include <Adafruit_GPS.h>

// what's the name of the hardware serial port?
#define GPSSerial Serial1

// Connect to the GPS on the hardware port
Adafruit_GPS GPS(&GPSSerial);

// Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console
// Set to 'true' if you want to debug and listen to the raw GPS sentences
#define GPSECHO true

uint32_t timer = millis();


void setup()
{
  //while (!Serial);  // uncomment to have the sketch wait until Serial is ready

  // connect at 115200 so we can read the GPS fast enough and echo without dropping chars
  // also spit it out
  Serial.begin(115200);
  delay(2000);
  Serial.println("Adafruit GPS library basic parsing test!");

  // 9600 NMEA is the default baud rate for Adafruit MTK GPS's- some use 4800
  GPS.begin(9600);
  // uncomment this line to turn on RMC (recommended minimum) and GGA (fix data) including altitude
  GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
  // uncomment this line to turn on only the "minimum recommended" data
  //GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY);
  // For parsing data, we don't suggest using anything but either RMC only or RMC+GGA since
  // the parser doesn't care about other sentences at this time
  // Set the update rate
  GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz update rate
  // For the parsing code to work nicely and have time to sort thru the data, and
  // print it out we don't suggest using anything higher than 1 Hz

  // Request updates on antenna status, comment out to keep quiet
  GPS.sendCommand(PGCMD_ANTENNA);

  delay(1000);

  // Ask for firmware version
  GPSSerial.println(PMTK_Q_RELEASE);
}

void loop() // run over and over again
{
  // read data from the GPS in the 'main loop'
  char c = GPS.read();
  // if you want to debug, this is a good time to do it!
  if (GPSECHO)
    if (c) Serial.print(c);
  // if a sentence is received, we can check the checksum, parse it...
  if (GPS.newNMEAreceived()) {
    // a tricky thing here is if we print the NMEA sentence, or data
    // we end up not listening and catching other sentences!
    // so be very wary if using OUTPUT_ALLDATA and trying to print out data
//    Serial.print(GPS.lastNMEA()); // this also sets the newNMEAreceived() flag to false
    if (!GPS.parse(GPS.lastNMEA())) // this also sets the newNMEAreceived() flag to false
      return; // we can fail to parse a sentence in which case we should just wait for another
  }

  // approximately every 2 seconds or so, print out the current stats
  if (millis() - timer > 2000) {
    timer = millis(); // reset the timer
    Serial.print("\nTime: ");
    if (GPS.hour < 10) { Serial.print('0'); }
    Serial.print(GPS.hour, DEC); Serial.print(':');
    if (GPS.minute < 10) { Serial.print('0'); }
    Serial.print(GPS.minute, DEC); Serial.print(':');
    if (GPS.seconds < 10) { Serial.print('0'); }
    Serial.print(GPS.seconds, DEC); Serial.print('.');
    if (GPS.milliseconds < 10) {
      Serial.print("00");
    } else if (GPS.milliseconds > 9 && GPS.milliseconds < 100) {
      Serial.print("0");
    }
    Serial.println(GPS.milliseconds);
    Serial.print("Date: ");
    Serial.print(GPS.day, DEC); Serial.print('/');
    Serial.print(GPS.month, DEC); Serial.print("/20");
    Serial.println(GPS.year, DEC);
    Serial.print("Fix: "); Serial.print((int)GPS.fix);
    Serial.print(" quality: "); Serial.println((int)GPS.fixquality);
    if (GPS.fix) {
      Serial.print("Location: ");
      Serial.print(GPS.latitude, 4); Serial.print(GPS.lat);
      Serial.print(", ");
      Serial.print(GPS.longitude, 4); Serial.println(GPS.lon);
      Serial.print("Speed (knots): "); Serial.println(GPS.speed);
      Serial.print("Angle: "); Serial.println(GPS.angle);
      Serial.print("Altitude: "); Serial.println(GPS.altitude);
      Serial.print("Satellites: "); Serial.println((int)GPS.satellites);
    }
  }
}

krinilssen
 
Posts: 6
Joined: Thu Jun 04, 2020 6:30 pm

Re: Ultimate GPS NMEA Output errors

by krinilssen on Sun Sep 19, 2021 12:21 am

The output I originally posted was from using adafruits GPS library with the example file code I posted above as well. What I was working on when the errors started occuring was adding parsing for GSV NMEA sentences with the following changes in the following files of the adafruit ultimate GPS library if it helps.


GPS.h:
Added a struct and two global variables to hold the GSV data

Code: Select all | TOGGLE FULL SIZE
struct activeSatallite {
  uint8_t satalliteId;
  uint8_t elevation;
  uint8_t azimuth;
  uint8_t SNR;
};

activeSatallite activeSatallites[12];
uint8_t satellitesInView;



NMEA_parse.cpp:
added the parsing code to the str compare else if's and moved it from under NMEA_EXTENSIONS up to the other strcmp statements that handle the "Normal" NMEA senteces like GGA and RMC.

Code: Select all | TOGGLE FULL SIZE
} else if (!strcmp(thisSentence, "GSV")) { //*****************************GSV
    // from Actisense NGW-1
    // Serial.println(F("inside GSV"));
    uint8_t messageNumber = 0;
    uint8_t satalliteMulitplier;
    // Serial.println(F("inside GSV 1"));
    // if (!isEmpty(p))
    //   uint8_t numberOfMessages = atoi(p);
    p = strchr(p, ',') + 1;
    // Serial.println(F("inside GSV 2"));
    if (!isEmpty(p))
      messageNumber = atoi(p);

    // Serial.print(F("messageNumber")); Serial.println(messageNumber);
    satalliteMulitplier = (messageNumber-1) * 4;
    p = strchr(p, ',') + 1;
    // Serial.println(F("inside GSV 3"));
    if (!isEmpty(p))
      satellitesInView = atoi(p);
    p = strchr(p, ',') + 1;
    // skip 12 Satellite PDNs without interpreting them
    // Serial.println(F("inside GSV 4"));

    uint8_t endPoint;

    if (satalliteMulitplier + 4 > satellitesInView) {
      endPoint = satellitesInView;
    } else {
      endPoint = satalliteMulitplier + 4;
    }

    for (int i = satalliteMulitplier; i < endPoint; i++) {
      // Serial.print(F("inside GSV 4.")); Serial.print(i);  Serial.println(".0");
      if (!isEmpty(p)) {
        // Serial.print(F("inside GSV 4.")); Serial.print(i);  Serial.println(".0.0");
        activeSatallites[i].satalliteId = atoi(p);
      } else {
        // Serial.print(F("inside GSV 4.")); Serial.print(i);  Serial.println(".0.1");
        activeSatallites[i].satalliteId = 0;
      }
      // Serial.print(F("inside GSV 4.")); Serial.print(i); Serial.println(".1");
      p = strchr(p, ',') + 1;
      if (!isEmpty(p)) {
        activeSatallites[i].elevation = atoi(p);
      } else {
        activeSatallites[i].elevation = 0;
      }
      // Serial.print(F("inside GSV 4.")); Serial.print(i); Serial.println(".2");
      p = strchr(p, ',') + 1;
      if (!isEmpty(p)) {
        activeSatallites[i].azimuth = atoi(p);
      } else {
        activeSatallites[i].azimuth = 0;
      }
      // Serial.print(F("inside GSV 4.")); Serial.print(i); Serial.println(".3");
      p = strchr(p, ',') + 1;
      if (!isEmpty(p)) {
        activeSatallites[i].SNR = atoi(p);
      } else {
        activeSatallites[i].SNR = 0;
      }
      // Serial.print(F("inside GSV 4.")); Serial.print(i); Serial.println(".4");
      p = strchr(p, ',') + 1;
    }
    // Serial.println(F("inside GSV 5"));
    // last before checksum

  }




PMTK.h:
The last file I altered was PMTK.h to include the instruction that tells the GPS to output RMC, GGA, and GSV NMEA sentences

Code: Select all | TOGGLE FULL SIZE
#define PMTK_SET_NMEA_OUTPUT_RMCGGAGSAGSV                                      \
       "$PMTK314,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0*29" ///< turn on GPRMC, GPGGA,
                                                                                           ///< GPGSA, GPGSV

krinilssen
 
Posts: 6
Joined: Thu Jun 04, 2020 6:30 pm

Re: Ultimate GPS NMEA Output errors

by krinilssen on Sun Sep 19, 2021 12:28 am

Ill include the library files together and the simple code I was running to display the GSV values as well if it helps. Sorry for the multiple posts... I am just clueless after spending the whole day trying to figure out what was going on to no avail.
Attachments
gps_parsing_test.ino
(5.48 KiB) Not downloaded yet
kristian_GPS.h
(13.55 KiB) Not downloaded yet
kristian_NMEA_parse.cpp
(31.78 KiB) Not downloaded yet

krinilssen
 
Posts: 6
Joined: Thu Jun 04, 2020 6:30 pm

Re: Ultimate GPS NMEA Output errors

by krinilssen on Mon Sep 20, 2021 3:11 pm

Still have no luck trying to solve this problem. Would really appreciate any help!

krinilssen
 
Posts: 6
Joined: Thu Jun 04, 2020 6:30 pm

Re: Ultimate GPS NMEA Output errors

by krinilssen on Tue Sep 21, 2021 2:13 pm

Solved the problem after countless hours of troubleshooting. Pretty much tried everything in the book. What ended up being the issue was that on my teensy 4.0 for some reason the SERIAL1 tx was not working. That was why I wasnt able to send any commands but im still not sure why the output would still be messed up like that. Switched to Serial4 and what do you know, it worked like a charm!

krinilssen
 
Posts: 6
Joined: Thu Jun 04, 2020 6:30 pm

Please be positive and constructive with your questions and comments.