Problème variable gps

Bonjour,
J'essaye de réaliser un tracker gps.

la lecture des coordonnées fonctionne en partie:
La première lecture du gps donne les bonnes coordonnées, mais les suivantes indiquent des coordonnées erronées. En fait elles contiennent les bonnes coordonnées mais avec en plus des caractères qui ne devraient plus être là. De mon point de vue, on dirait que les variables ne soient pas correctement réinitialisées après chaque lecture. C'est du moins ce que je pense. Quelqu'un pourrait m'en dire un peut plus??
merci

code

#include <SoftwareSerial.h>
#include <SPI.h> // Pour la communication SPI
#include <SD.h>  // Pour la communication avec la carte SD

const byte SDCARD_CS_PIN = 10; //* Broche CS de la carte SD */
SoftwareSerial sim808(7, 8);

char phone_no[] = "+33111111111"; // replace with your phone no.
String data[5];
#define DEBUG true
String state, timegps, latitude, longitude, last_lat, last_long;

int nb_lecture = 0;
String heure, date;

File myFile;
char Fichier[32] = "Test_GPS.txt"; // par la suite nom à créer en incrémentant les fichiers existants


void setup() {
 pinMode(10, OUTPUT); // Arduino UNO//pinMode(53, OUTPUT); // Arduino Mega
 sim808.begin(9600);
 Serial.begin(9600);
 delay(50);

 sim808.println("AT+CSMP=17,167,0,0");  // set this parameter if empty SMS received///////////////////////
 delay(100);
 sim808.print("AT+CMGF=1\r");
 delay(400);

 sendData("AT+CGNSPWR=1", 1000, DEBUG);
 delay(50);
 sendData("AT+CGNSSEQ=RMC", 1000, DEBUG);
 delay(150);

 last_lat = latitude;
 last_long = longitude;

 /* Initialisation de la carte SD */
 Serial.println(F("Init SD card... "));
 if (!SD.begin(SDCARD_CS_PIN)) {
 Serial.println(F("FAIL"));
 //for (;;); //  appui sur bouton RESET
 }
 else {
 Serial.println(F("OK"));
 myFile = SD.open(Fichier, FILE_WRITE);
 if (myFile)
 {//si le fichier est ouvert
 Serial.println("Fichier ouvert en écriture");
 }
 else
 {//si le fichier ne peut pas être ouvert
 Serial.println("Erreur ouverture fichier");
 Serial.println();
 }
 }
}

void loop() {
 sendTabData("AT+CGNSINF", 1000, DEBUG);

 if (state != 0) {
 Serial.print("State  : "), Serial.println(state);
 heure = timegps.substring(8, 12);

 Serial.print("Time  : "), Serial.println(heure);
 Serial.print("Latitude  : "), Serial.println(latitude);
 Serial.print("Longitude  : "), Serial.println(longitude);
 nb_lecture++;
 Serial.print("lecture: "), Serial.println(nb_lecture);
 Serial.println();
 ecriture();
 // sim808.print("AT+CMGS=\"");
 // sim808.print(phone_no);
 // sim808.println("\"");
 // delay(300);
 // sim808.print("http://maps.google.com/maps?q=loc:");
 // sim808.print(latitude);
 // sim808.print(",");
 // sim808.print(longitude);
 // delay(200);
 //   sim808.println((char)26); // fin du message
 // delay(200);
 //   sim808.println();
 // delay(20000);
 sim808.flush();
 last_lat = latitude;
 last_long = longitude;
 latitude = "";
 longitude = "";
 timegps = "";
 state = "";
 }
 else {
 Serial.println("GPS Initialising...");
 }
}

void sendTabData(String command, const int timeout, boolean debug) {

 sim808.println(command);
 long int time = millis();
 int i = 0;

 while ((time + timeout) > millis()) {
 while (sim808.available()) {
 char c = sim808.read();
 if (c != ',') {
 data[i] += c;
 delay(100);
 }
 else {
 i++;
 }
 if (i == 5) {
 delay(100);
 goto exitL;
 }
 }
 }exitL:
 if (debug) {
 state = data[1];
 timegps = data[2];
 latitude = data[3];
 longitude = data[4];
 }
}
String sendData(String command, const int timeout, boolean debug) {
 String response = "";
 sim808.println(command);
 long int time = millis();
 int i = 0;

 while ((time + timeout) > millis()) {
 while (sim808.available()) {
 char c = sim808.read();
 response += c;
 }
 }
 if (debug) {
 Serial.print(response);
 }
 return response;
}

void ecriture() {
 myFile.print("/*");
 myFile.print(heure);
 myFile.print("_");
 myFile.print(latitude);
 myFile.print("_");
 myFile.print(longitude);
 myFile.println("*/");
 // myFile.close();
}

résultats du moniteur serie

State  : 1
Time  : 0652
Latitude  : 50.709827
Longitude  : 2.1795671
lecture: 1

State  : 11
Time  : 0652
Latitude  : 50.70982750.709822
Longitude  : 2.17956712.1795721
lecture: 2

State  : 111
Time  : 
Latitude  : 50.70982750.70982250.709808
Longitude  : 2.17956712.17957212.1795651
lecture: 3

State  : 1111
Time  : 
Latitude  : 
Longitude  : 
lecture: 4
 data[i] += c;

Si tu ne vides pas data avant de concaténer, les caractères s'ajoutent.
Le plus simple est de déplacer le tableau data en local :
```
*void sendTabData(String command, const int timeout, boolean debug) {

sim808.println(command);
  long int time = millis();
  int i = 0;
  String data[5];
  // ...*
* *Tu pourrais indenter ton code (CTRL-T) c'est illisible.* *
String state, timegps, latitude, longitude, last_lat, last_long;
```
String est pratique mais sur un ATMEGA328 cela risque de te mener droit à la fragmentation de la mémoire.
Utiliser char [] serait préférable.

Et évite de mettre un numéro de téléphone en clair sur un forum (édite ton message et remplace le par des ***)

Merci à tous les 2,

lesept, le numéro est changé.

hbachetti,
j'ai déplacé //String data[5]// et c'est bon ça marche. Merci.
Par contre que veut dire "aller à la fragmentation de la mémoire"??

Il suffit de chercher :