I might be about to give up on this platform and look for an alternative. From my 30+ years of writing code I always worked under the assumption that when code produced different results you searched for the reason.
Well, in this case here, the example should not work correctly yet it does.
For the background.
I was trying to make an Adafruit ultimate GPS board work with a Feather Huzzah using SoftwareSerial, and I tried to break it down into simple bites (bytes,
). I was using the example programs and working with them.
For the record, the example programs for the GPS and SoftwareSerial need to be made much simpler.
Onward:
This is the example program that I now have working. I dont remember exactly where I got it. 
//Make sure to install the adafruit GPS library from https://github.com/adafruit/Adafruit-GPS-Library
#include <Adafruit_GPS.h> //Load the GPS Library. Make sure you have installed the library form the adafruit site above
#include <SoftwareSerial.h> //Load the Software Serial Library. This library in effect gives the arduino additional serial ports
SoftwareSerial mySerial(12, 13); //Initialize SoftwareSerial, and tell it you will be connecting through pins 12 and 13
Adafruit_GPS GPS(&mySerial); //Create GPS object
String NMEA1; //We will use this variable to hold our first NMEA sentence
String NMEA2; //We will use this variable to hold our second NMEA sentence
char c; //Used to read the characters spewing from the GPS module
void setup()
{
Serial.begin(115200); //Turn on the Serial Monitor
Serial.println(" ");
Serial.println(" I am here ");
GPS.begin(9600); //Turn GPS on at baud rate of 9600
GPS.sendCommand("$PGCMD,33,0*6D"); // Turn Off GPS Antenna Update
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); //Tell GPS we want only $GPRMC and $GPGGA NMEA sentences
GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz update rate
delay(1000); //Pause
Serial.println(" ");
Serial.println(" I am after the pause ");
}
void loop() // run over and over again
{
Serial.println(" ");
Serial.println(" I am before readgps ");
readGPS(); //This is a function we define below which reads two NMEA sentences from GPS
Serial.println(" ");
Serial.println(" I am after readGPS ");
}
void readGPS()
{
//This function will read and remember two NMEA sentences from GPS
clearGPS(); //Serial port probably has old or corrupt data, so begin by clearing it all out
while(!GPS.newNMEAreceived()) { //Keep reading characters in this loop until a good NMEA sentence is received
c=GPS.read(); //read a character from the GPS
}
/* Serial.println(" I am here 2"); */
GPS.parse(GPS.lastNMEA()); //Once you get a good NMEA, parse it
NMEA1=GPS.lastNMEA(); //Once parsed, save NMEA sentence into NMEA1
while(!GPS.newNMEAreceived()) { //Go out and get the second NMEA sentence, should be different type than the first one read above.
c=GPS.read();
}
GPS.parse(GPS.lastNMEA());
NMEA2=GPS.lastNMEA();
Serial.println(NMEA1);
Serial.println(NMEA2);
Serial.println("");
}
void clearGPS() { //Since between GPS reads, we still have data streaming in, we need to clear the old data by reading a few sentences, and discarding these
while(!GPS.newNMEAreceived()) {
c=GPS.read();
}
GPS.parse(GPS.lastNMEA());
while(!GPS.newNMEAreceived()) {
c=GPS.read();
}
GPS.parse(GPS.lastNMEA());
}
You will note from this statement
SoftwareSerial mySerial(12, 13); //Initialize SoftwareSerial, and tell it you will be connecting through pins 12 and 13
that the code should be using pin numbers 12 and 13. In fact the wiring has the GPS connected to pins 12 and 14 and yet it works as this output shows. The various comments are intended for me to try and trace what the code is doing. When I actually hook it up to pins 12 and 13 it doesnt work !
10:02:40.001 -> I am here
10:02:41.126 ->
10:02:41.126 -> I am after the pause
10:02:41.126 ->
10:02:41.126 -> I am before readgps
10:02:41.821 -> $PMTK001,220,3*30
10:02:41.821 ->
10:02:41.821 -> $GPGGA,235$GPGGA,235948.799,,,,,0,00,,,M,,M,,*7E
10:02:41.821 ->
10:02:41.821 ->
10:02:41.821 ->
10:02:41.821 -> I am after readGPS
10:02:41.821 ->
10:02:41.821 -> I am before readgps
10:02:43.841 -> $GPRMC,235949.799,V,,,,,0.00,0.00,050180,,,N*46
10:02:43.841 ->
10:02:43.841 -> $GPGGA,235950.800,,,,,0,00,,,M,,M,,*78
10:02:43.841 ->
SHEESH!!! >:( >:( >:(