TinyGPS++ - Failed checksum

Okay, here we go.

I think i just need a loop that reads the GPS data until it gets a valid sentence
and then it can move on.

There must be something wrong with this while loop that i have.

#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <Adafruit_STMPE610.h>
#include <TinyGPS++.h>
#include <SPI.h>
#include <Wire.h>
#include <avr/pgmspace.h>

// Erstelle Objekte
Adafruit_STMPE610 ts = Adafruit_STMPE610(44);
Adafruit_ILI9341 tft = Adafruit_ILI9341(45,46);
TinyGPSPlus gps;

// Interface Variablen
int battPower        = 100;
int batteryChange    = 0;
int GPSSatChange     = 0;
int GPSErrChange     = 0;

// Serial Communication Variablen
char    serialInData[10];
int     serialIndex;
boolean serialStarted = false;
boolean serialEnded   = false;

// GPS Variablen
float latitude;
float longitude;
float aSeaLevel;
int UTCDay;
int UTCMonth;
int UTCYear;
int UTCHour;
int UTCMinute;
int UTCSecond;
boolean validGPS = false;
int timeout;

// Sprite Grafiken
//Batterie Icons
const unsigned char BattFrame [] PROGMEM = {
	Hidden
};
const unsigned char BattBar_1 [] PROGMEM = {
	Hidden
};
const unsigned char BattBar_2 [] PROGMEM = {
	Hidden
};
const unsigned char BattBar_3 [] PROGMEM = {
	Hidden
};
const unsigned char BattBar_4 [] PROGMEM = {
	Hidden
};
const unsigned char BattBar_5 [] PROGMEM = {
	Hidden
};
const unsigned char BattBar_6 [] PROGMEM = {
	Hidden
};
const unsigned char BattBar_7 [] PROGMEM = {
	Hidden
};
const unsigned char BattBar_8 [] PROGMEM = {
	Hidden
};
// GPS Icons
const unsigned char GPSBar_1 [] PROGMEM = {
	Hidden
};
const unsigned char GPSBar_2 [] PROGMEM = {
	Hidden
};
const unsigned char GPSBar_3 [] PROGMEM = {
	Hidden
};
const unsigned char GPSBar_4 [] PROGMEM = {
	Hidden
const unsigned char GPSBar_5 [] PROGMEM = {
	Hidden
};
const unsigned char GPSBar_6 [] PROGMEM = {
	Hidden
};
const unsigned char GPSBar_clear [] PROGMEM = {
	Hidden
};

void setup() {
	
	tft.begin();
	tft.fillScreen(ILI9341_WHITE);
	tft.setRotation(1);
	tft.fillRect(0,0,320,26,ILI9341_BLACK);
	tft.drawBitmap(260,1,GPSBar_1,24,24,ILI9341_WHITE);
	tft.setTextWrap(false);
	tft.setTextColor(ILI9341_BLACK,ILI9341_WHITE);
	tft.setTextSize(1);
	
	Serial.begin(9600);
	Serial1.begin(38400);                                // Standard Baud Rate des iTead GPS Shield
	Serial1.print("$PUBX,41,1,0007,0003,4800,0*13\r\n"); // Ändern der iTead Baud Rate
	Serial1.flush();
	delay(50);

	Serial1.begin(4800);                                 // Reset Serial Baud Rate
	Serial1.flush();
	delay(500);

}
void loop() {
	
	battPower = serialCom(battPower);
	batteryStatus();
	GPSStatus ();
	GUIUpdate();
	//deBug ();
}

// Funktionen
int serialCom (int battPower){
	
	while(Serial.available() > 0)
	{
		char aChar = Serial.read();
		if(aChar == '<')
		{
			serialStarted = true;
			serialIndex = 0;
			serialInData[serialIndex] = '\0';
		}
		else if(aChar == '>')
		{
			serialEnded = true;
		}
		else if(serialStarted)
		{
			serialInData[serialIndex] = aChar;
			serialIndex++;
			serialInData[serialIndex] = '\0';
		}
	}


	if(serialStarted && serialEnded)
	{
		// Convert the string to an integer
		int serialInput = atoi(serialInData);
		battPower   = serialInput;
		
		Serial.print("Eingabe war: ");
		Serial.println(serialInput);
		Serial.print("Batterie: ");
		Serial.println(battPower);
		
		// Get ready for the next time
		serialStarted = false;
		serialEnded   = false;
		serialIndex = 0;
		serialInData[serialIndex] = '\0';
		
	}

	return battPower;
}
void batteryStatus (){
	
	if (batteryChange != battPower){

		tft.drawBitmap(298,9,BattBar_8,24,16,ILI9341_BLACK);{tft.drawBitmap(298,9,BattFrame,24,16,ILI9341_WHITE); }
		if (battPower >= 1  && battPower <= 12) {tft.drawBitmap(298,9,BattBar_1,24,16,ILI9341_RED);   }
		if (battPower >= 13 && battPower <= 25) {tft.drawBitmap(298,9,BattBar_2,24,16,ILI9341_WHITE); }
		if (battPower >= 26 && battPower <= 37) {tft.drawBitmap(298,9,BattBar_3,24,16,ILI9341_WHITE); }
		if (battPower >= 38 && battPower <= 50) {tft.drawBitmap(298,9,BattBar_4,24,16,ILI9341_WHITE); }
		if (battPower >= 51 && battPower <= 62) {tft.drawBitmap(298,9,BattBar_5,24,16,ILI9341_WHITE); }
		if (battPower >= 63 && battPower <= 75) {tft.drawBitmap(298,9,BattBar_6,24,16,ILI9341_WHITE); }
		if (battPower >= 76 && battPower <= 87) {tft.drawBitmap(298,9,BattBar_7,24,16,ILI9341_WHITE); }
		if (battPower >= 88 && battPower <= 100){tft.drawBitmap(298,9,BattBar_8,24,16,ILI9341_WHITE); }
		batteryChange = battPower;
	}
}
void GPSStatus (){
	
	while (Serial1.available() >0)    // <-----  Here is the Problem!!
	{                                 // Maybe a loop that reads until a valid sentence is received?
		gps.encode(Serial1.read());
	}
	
	
	
	if  (Serial.available()==0)
	{
		timeout++;
	}
	if (millis() > 5000 && gps.charsProcessed() < 10)
	{
		Serial.println(F("No GPS detected!"));
		while(true);
	}
	
	latitude  = gps.location.lat();
	longitude = gps.location.lng();
	aSeaLevel = gps.altitude.meters();
	
	UTCDay    = gps.date.day();
	UTCMonth  = gps.date.month();
	UTCYear   = gps.date.year();
	
	UTCHour   = gps.time.hour();
	UTCMinute = gps.time.minute();
	UTCSecond = gps.time.second();
}
void GUIUpdate(){
	
	
	// Location
	if (gps.location.isValid() && gps.location.isUpdated())      // VALID Location ?
	{
		tft.setCursor(5, 40);
		tft.print("Lat  : ");
		tft.print(latitude, 6);
		tft.print("        ");
		tft.setCursor(5, 50);
		tft.print("Long : ");
		tft.print(longitude, 6);
		tft.print("        ");
		tft.setCursor(5, 60);
		tft.print("Level: ");
		tft.print(aSeaLevel);
		tft.print("        ");
		GPSErrChange == 0;
	}
	
	// Date
	if (gps.date.isValid() && gps.date.isUpdated())
	{
		tft.setCursor(5, 70);
		tft.print("Date : ");
		tft.print(UTCDay);
		tft.print(".");
		tft.print(UTCMonth);
		tft.print(".");
		tft.print(UTCYear);
		tft.print("  ");
		GPSErrChange == 0;
	}
	
	// Time
	if (gps.time.isValid() && gps.time.isUpdated())
	{
		tft.setCursor(5, 80);
		tft.print("Time :               ");
		tft.setCursor(5, 80);
		tft.print("Time : ");
		if (UTCHour < 10) tft.print("0");
		tft.print(UTCHour);
		tft.print(":");
		if (UTCMinute < 10) tft.print("0");
		tft.print(UTCMinute);
		tft.print(":");
		if (UTCSecond < 10) tft.print("0");
		tft.print(UTCSecond);
		GPSErrChange == 0;
	}
	
	if (GPSSatChange != gps.satellites.value()){                 // Update HUD Satellite Icon
		
		tft.drawBitmap(260,1,GPSBar_clear,24,24,ILI9341_BLACK);
		if (gps.satellites.value() == 0  ) {tft.drawBitmap(260,1,GPSBar_1,24,24,ILI9341_WHITE);   }
		if (gps.satellites.value() >= 1  && gps.satellites.value() <=  2) {tft.drawBitmap(260,1,GPSBar_2,24,24,ILI9341_WHITE);   }
		if (gps.satellites.value() >= 3  && gps.satellites.value() <=  4) {tft.drawBitmap(260,1,GPSBar_3,24,24,ILI9341_WHITE);   }
		if (gps.satellites.value() >= 5  && gps.satellites.value() <=  6) {tft.drawBitmap(260,1,GPSBar_4,24,24,ILI9341_WHITE);   }
		if (gps.satellites.value() >= 7  && gps.satellites.value() <=  9) {tft.drawBitmap(260,1,GPSBar_5,24,24,ILI9341_WHITE);   }
		if (gps.satellites.value() >= 10 ) {tft.drawBitmap(260,1,GPSBar_6,24,24,ILI9341_WHITE);   }
		
		
		tft.setCursor(5, 30);                                    // Update Satellites Info
		tft.print("Satellites: ");
		tft.print(gps.satellites.value());
		tft.print("             ");
		
		GPSSatChange = gps.satellites.value();
	}


	if (GPSErrChange == 0 && gps.satellites.value() == 0) {      // INVALID GPS DATA TFT DISPLAY (Once)
		
		tft.setCursor(5, 30);                                    // Update Satellites Info
		tft.print("Satellites: No Signal!");
		tft.setCursor(5, 40);
		tft.print("Lat  : --.------");
		tft.setCursor(5, 50);
		tft.print("Long : --.------");
		tft.setCursor(5, 60);
		tft.print("Level: --.------");
		
		GPSErrChange = 1;
	}





}
void deBug (){
	
	tft.setCursor(5, 140);
	tft.print("------- Debugging -------");
	
	tft.setCursor(5, 170);
	tft.print("Error Switch: ");
	tft.print(GPSErrChange);
	
	tft.setCursor(5, 180);
	tft.print("Satellites  : ");
	tft.print(gps.satellites.value());
	
	tft.setCursor(5, 190);
	tft.print("Chars proc  : ");
	tft.print(gps.charsProcessed());
	
	tft.setCursor(5, 200);
	tft.print("Sent w Fix  : ");
	tft.print(gps.sentencesWithFix());
	
	tft.setCursor(5, 210);
	tft.print("Failed Check: ");
	tft.print(gps.failedChecksum());
	
	tft.setCursor(5, 220);
	tft.print("Passed Check: ");
	tft.print(gps.passedChecksum());
	
	
	
	tft.setCursor(150, 170);
	tft.print("Serial1 read: ");
	tft.print(Serial1.read());
	tft.print("    ");
	
	tft.setCursor(150, 180);
	tft.print("Seria1 avail: ");
	tft.print(Serial1.available(),DEC);
	tft.print("    ");
	
	tft.setCursor(150, 190);
	tft.print("Timeouts    : ");
	tft.print(timeout);
	tft.print("    ");

}