[RESOLU] Adafruit ultimate GPS et routine .parse qui retourne false

Bonjour à tous,

J'ai un projet sur lequel j'utilise l'ultimate GPS breakout. Je suis nouveau dans le monde d'arduino et de la programmation mais n'étant pas totalement incompétant, j'ai compris le fonctionnement de base arduino et me suis inspiré de l'example "parsing" fourni avec la librairie pour faire un programme qui fonctionne quasi parfaitement.

Donc : ce sketch utilise une interruption pour vérifier si des nouvelles données ont été envoyées pas la puce GPS et, dans ce cas, les compiler.

 // if a sentence is received, we can check the checksum, parse it...
  if (GPS.newNMEAreceived()) {
    // a tricky thing here is if we print the NMEA sentence, or data
    // we end up not listening and catching other sentences! 
    // so be very wary if using OUTPUT_ALLDATA and trytng to print out data
    //Serial.println(GPS.lastNMEA());   // this also sets the newNMEAreceived() flag to false
  
    if (!GPS.parse(GPS.lastNMEA()))   // this also sets the newNMEAreceived() flag to false
      return;  // we can fail to parse a sentence in which case we should just wait for another
  }

Si j'ai bien compris cette portion de code : si des nouvelles données sont arrivées, il vérifie leur validité avec "if (!GPS.parse(GPS.lastNMEA()))" et sors de la condition si ce n'est pas le cas. Mais pendant mes test j'ai eu l'impression qu'il y avait un problème à cet endroit. J'ai donc voulu tester ça:

 // if a sentence is received, we can check the checksum, parse it...
  if (GPS.newNMEAreceived()) {
    // a tricky thing here is if we print the NMEA sentence, or data
    // we end up not listening and catching other sentences! 
    // so be very wary if using OUTPUT_ALLDATA and trytng to print out data
    //Serial.println(GPS.lastNMEA());   // this also sets the newNMEAreceived() flag to false
  
    if (!GPS.parse(GPS.lastNMEA()))   // this also sets the newNMEAreceived() flag to false
      Serial.println("Parsing failed");
  }

Du coup, il m'imprime "Parsing failed" à chaque cycle même si les données sont valides et correctement compilées. Je peux d'ailleurs afficher ma position sans probème. Ce qui me gêne, c'est que je ne peux pas utiliser la condition parsing réussi ou foiré.

Je me suis demandé si ça pouvait être une erreur d'écriture ou un bug dans la librairie mais je suis trop novice pour aller chercher si loin.

Est-ce que quelqu'un aurait une idée ou aurait déjà rencontré ce problème ? Merci d'avance.

Un petit up dans l'espoir que quelqu'un vienne à mon secours :(

hello
tu es sur que ce n’est pas toi qui te plantes dans ton interprétation du code:

if (GPS.newNMEAreceived()) { //comprendre si le gps a envoyé des data au micro
Serial.println(GPS.lastNMEA()); //alors on les envoie sur le moniteur

if (!GPS.parse(GPS.lastNMEA())) //si le gps n’envoie plus de data
return; // alors on retourne à l’appelant

toi tu as modifié par
if (!GPS.parse(GPS.lastNMEA())) //si le gps n’envoie plus de data
Serial.println(“Parsing failed”); //tu envoies parsing failed au moniteur

c’est toi qui décides qu’il y a un défaut.et ce que tu dis ensuite me semble normal

Du coup, il m’imprime “Parsing failed” à chaque cycle même si les données sont valides et correctement compilées. Je peux d’ailleurs afficher ma position sans probème.

Merci pour ta réponse La ligne if (!GPS.parse(GPS.lastNMEA())) sert à vérifier la validité des données mais pas leur présence.

// we can fail to parse a sentence in which case we should just wait for another

C'est pour ça que j'ai modifié le code avec Serial.println("Parsing failed"); pour qu'il me prévienne que les données sont invalides (pour les tests)

Ca marche !

En fait, mon problème vient d'un réglage dans l'initialisation du code (du coup il manquait des informations dans ma question...) Cette ligne

GPS.sendCommand(PGCMD_ANTENNA);

demande à la puce GPS d'envoyer des informations sur le statut de l'antenne sous la forme de $PGTOP sentence (antenne interne ou externe.) Le problème, c'est que la fonction GPS.parse ne peut pas vérifier ces données $PGTOP et retourne donc systématiquement faux. J'ai donc dû désactiver l'envoi de ces infos avec

GPS.sendCommand(PGCMD_NOANTENNA);

Merci au support Adafruit et à Tranc3r sur ce thread http://forums.adafruit.com/viewtopic.php?f=22&t=32912

Je peux maintenant savoir exactement quand il n'a pas pu obtenir de données valides et agir en conséquence.