The use of the isvalid() function when reading a GPS is fundamentally flawed.
while(ss.available() > 0){
if (gps.encode(ss.read()))
{
if (gps.location.isValid()){
testStruct.lat = gps.location.lat();
}
if (gps.time.isValid()){
testStruct.s = gps.time.second();
}
}
The first time the TinyGPSplus library decodes a location fix the isvalid() flag is set and it remains set until the Arduino is restarted. So if after the first location fix the GPS stops getting location fixes then isvalid() still remains true.
Most GPSs will be putting out NMEA sentences that dont contain location data, so you should not be assuming that after every encode() there is new location data to send. No point in spending time transferring GPS location data if none of it has changed.
See the 'KitchenSink.ino' example in the TinyGPS library, it uses the isUpdated() function to identify when, after encoding a NMEA sentence with encode(), a parameter such as the location actually has new information.