Bonjour,
Voila un moment que j'essaye de récupérer les données de mon module GSM dans un tableau à deux dimensions.
Pour cette trame :
$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
Mon tableau aurait cette tête :
{{'$','G','P','R','M','C'},
{'1','2','3','5','1','9'},
{A},
{'4','8','0','7','.','0','3','8'},
{'N'},
[...]
{'0','0','3','.','1'},
{'W','*','6','A'}}
Le code doit fonctionner aussi bien pour une trame RMC que pour une trame GGA.
Voici mon code :
void test() {
Serial.begin(9600);
char *stringptr = GPS.lastNMEA();
int maxfieldsize = 0;
int currentfieldsize = 0;
int nbfield = 1;
int sizeOfString = strlen(stringptr);
String sFieldNb = "";
String sMaxSize = "";
//Je cast pour la concaténation
String sSize = (String) sizeOfString;
Serial.println("--+--+--: Size of String : "+sSize);
// On parcours la chaîne
for (int i=0; i < sizeOfString; i++) {
// Si on a une virgule
if (stringptr[i] == ',') {
// Et que le champs est le plus grand rencontré
if (currentfieldsize > maxfieldsize) {
// Mise à jour de la taille maxi
maxfieldsize = currentfieldsize;
}
nbfield++;
currentfieldsize = 0;
sFieldNb = (String) nbfield;
sMaxSize = (String) maxfieldsize;
delay(100);
Serial.println("--+--: Entering New Field (nb: "+sFieldNb+" / maxSize: "+sMaxSize+")");
delay(100);
// Si ce n'est pas une virgule
} else {
currentfieldsize++;
String sChar = (String) stringptr[i];
delay(100);
Serial.println("--: New char Counted: "+ sChar);
delay(100);
}
}
// Si le champs est le plus grand jamais rencontré
if (currentfieldsize > maxfieldsize) {
// Mise à jour de la taille maxi
maxfieldsize = currentfieldsize;
}
String sNbField = (String) nbfield;
Serial.println("--D--: Number of field : "+ nbfield);
String sMaxFieldSize = (String) maxfieldsize;
Serial.println("--D--: Max Field Size : "+ sMaxFieldSize);
// On déclare tab2d avec une taille désormais connue
char ParsedNMEA[nbfield][maxfieldsize+1];
int currentfieldnumber = 0;
int currentcharnumber = 0;
// On parcour la chaine
for (int i=0; i < strlen(stringptr); i++) {
// Si on a une virgule
if (stringptr[i] == ',') {
// On termine la sous-chaîne par un '\0'
ParsedNMEA[currentfieldnumber][currentcharnumber] = '\0';
// On avance sur le champs courant
currentfieldnumber++;
currentcharnumber = 0;
// Si ce n'est pas une virgule
} else {
// On ajoute au tableau
ParsedNMEA[currentfieldnumber][currentcharnumber] = stringptr[i];
// On avance sur la sous_chaîne
currentcharnumber++;
}
}
// On parcours le tableau
for (int i=0; i<strlen(ParsedNMEA[i]); i++) {
for (int j=0; j<strlen(ParsedNMEA[j]); j++) {
// Si on arrive au caractère de fin de chaîne
if (ParsedNMEA[i][j] == '\0') {
break;
} else {
// On affiche les chaînes
Serial.print(ParsedNMEA[i][j]);
}
}
Serial.print('\n');
}
int tailleLatitude= strlen(ParsedNMEA[1]);
char myLatitude[tailleLatitude];
for (int i=0; i<strlen(ParsedNMEA[i]); i++) {
for (int j=0; j<strlen(ParsedNMEA[j]); j++) {
Serial.print(ParsedNMEA[i][j]);
}
}
}
Et voici mon moniteur série (j'ai brouillé mes coordonnées GPS bien sûr ) :
-+--+--: Size of String : 68
--: New char Counted:
--: New char Counted: $
--: New char Counted: G
--: New char Counted: P
--: New char Counted: R
--: New char Counted: M
--: New char Counted: C
--+--: Entering New Field (nb: 2 / maxSize: 7)
--: New char Counted: 1
--: New char Counted: 2
--: New char Counted: 1
--: New char Counted: 7
--: New char Counted: 4
--: New char Counted: 1
--: New char Counted: .
--: New char Counted: 0
--: New char Counted: 0
--+--: Entering New Field (nb: 3 / maxSize: 9)
--: New char Counted: A
--+--: Entering New Field (nb: 4 / maxSize: 9)
--: New char Counted: x
--: New char Counted: x
--: New char Counted: x
--: New char Counted: x
--: New char Counted: .
--: New char Counted: 1
--: New char Counted: 1
--: New char Counted: 6
--: New char Counted: 2
--: New char Counted: 5
--+--: Entering New Field (nb: 5 / maxSize: 10)
--: New char Counted: N
--+--: Entering New Field (nb: 6 / maxSize: 10)
--: New char Counted: x
--: New char Counted: x
--: New char Counted: x
--: New char Counted: x
--: New char Counted: 5
--: New char Counted: .
--: New char Counted: 7
--: New char Counted: 8
--: New char Counted: 5
--: New char Counted: 3
--: New char Counted: 5
--+--: Entering New Field (nb: 7 / maxSize: 11)
--: New char Counted: E
--+--: Entering New Field (nb: 8 / maxSize: 11)
--: New char Counted: 0
--: New char Counted: .
--: New char Counted: 7
--: New char Counted: 3
--: New char Counted: 7
--+--: Entering New Field (nb: 9 / maxSize: 11)
--+--: Entering New Field (nb: 10 / maxSize: 11)
--: New char Counted: 2
--: New char Counted: 9
--: New char Counted: 0
--: New char Counted: 5
--: New char Counted: 1
--: New char Counted: 7
--+--: Entering New Field (nb: 11 / maxSize: 11)
--+--: Entering New Field (nb: 12 / maxSize: 11)
--+--: Entering New Field (nb: 13 / maxSize: 11)
--: New char Counted: A
--: New char Counted: *
--: New char Counted: 7
--: New char Counted: 1
--: New char Counted:
of field :
--D--: Max Field Size : 11
$
12
$12 //la chaîne finale
J'ai essayé de prendre des bonnes habitudes de programmation mais mon petit doigt me dit c'est pas encore le top niveau..
J'utilise la librairie suivante :
Si quelqu'un à une solution pour que je remplisse mon tableau correctement merci !