Problème USART - ATMega2560

Bonjour à tous,

J'essaie de lire les données d'un récepteur GPS, programmé à 5Hz avec un baudrate de 57600, via l'usart de mon ATMega2560 (quartz de 8MHz) mais je ne reçois, au mieux, que quelques trames incomplètes, ou au pire je ne reçois rien du tout !

J'ai tout d'abord testé à 57600baud, je recevais quelques bouts de trames, j'ai testé 9600, 19200 je ne reçois rien, puis maintenant 57600 à nouveau et je n'ai plus rien du tout !

Est-ce que qq'un a déjà eu ce pbl et pourrait m'aider ?

J'ai un peu modifié un code fourni par arduino pour tester :

String inputString = ""; // a string to hold incoming data
boolean stringComplete = false; // whether the string is complete

void setup() {
Serial.begin(57600); // PC
Serial1.begin(57600); // GPS
inputString.reserve(200);
}

void loop() {
// print the string when a newline arrives:
if (stringComplete) {
Serial.println(inputString);
// clear the string:
inputString = "";
stringComplete = false;
}
}

void serialEvent() {
while (Serial1.available()) {
char inChar = (char)Serial1.read();
inputString += inChar;
if (inChar == 0x0A) { // 0x0A ==
stringComplete = true;
}
}
}

Merci pour votre aide

Jean

Bonjour,

L'utilisation de SerialEvent implique une gestion rapide et efficace des données reçues.
Ici je vois une String ... c'est tout sauf rapide et efficace, en plus c'est un coup à planter complétement le programme.

Ici une façon bien plus efficace serait d'utiliser la fonction Serial.readBytesUntil() - Arduino Reference au lieu de SerialEvent.
Ou mieux de faire une machine à états fini pour traiter chaque octet reçus en temps réel.
Il existe des librairies toutes prêtes pour cela et même un tutoriel dans la partie tutoriel du forum :wink:

La fonction ReadBytesUntil() nécessite de connaitre la taille des trames en entrée, non ?
Du coup, j'aimerais lire des trames GPS à 5Hz, mais j'ai aucune idée de leur taille.

J'ai trouvé un tuto sur le forum mais il utilise aussi une String... :

Si tu as mieux, je prends ! :wink:

Étant donné que je souhaite traiter mes données rapidement (et aussi éviter l'overflow du RX_BUFFER), je suis obligé d'utiliser le SerialEvent quand même ?

Merci

Jean

jean23:
..
Du coup, j'aimerais lire des trames GPS à 5Hz, mais j'ai aucune idée de leur taille.

...
Étant donné que je souhaite traiter mes données rapidement (et aussi éviter l'overflow du RX_BUFFER), je suis obligé d'utiliser le SerialEvent quand même ?

bonjour
pour traiter de la sentence/trame NMEA à 5Hz à 57600 avec un arduino 8MHz, tu es quasi en limite de possibilité, tu ne pourra pas faire grand chose de plus.
déja tu sort quoi comme sentences ? de la RMC et ?
les trames ne sont pas de longueurs fixes et identiques.
c'est quoi comme recepteur GPS ?
voir une discussion avec un probleme similaire ici :
http://forum.arduino.cc/index.php?topic=160243.0

Artouste:
pour traiter de la sentence/trame NMEA à 5Hz à 57600 avec un arduino 8MHz, tu es quasi en limite de possibilité, tu ne pourra pas faire grand chose de plus.
déja tu sort quoi comme sentences ? de la RMC et ?
c'est quoi comme recepteur GPS ?

C'est vrai que j'ai peut-être mal dimensionné ma liaison série : je reçois du RMC et GGA. J'ai baissé à 2Hz pour le moment, du coup du 9600baud ça devrait le faire (sur le papier).

Par contre, cela ne solutionne pas mon problème, en réalité. J'ai toujours rien en sortie !

Commence par des trucs basiques pour valider la liaison.

void setup() {
  Serial.begin(57600);  //  PC
  Serial1.begin(57600); // GPS
}

void loop() {
    if(Serial1.available()) {
       Serial.write(Serial1.read());
  }
}

jean23:
C'est vrai que j'ai peut-être mal dimensionné ma liaison série : je reçois du RMC et GGA. J'ai baissé à 2Hz pour le moment, du coup du 9600baud ça devrait le faire (sur le papier).

Par contre, cela ne solutionne pas mon problème, en réalité. J'ai toujours rien en sortie !

tu configure comment (equipement) le baudrate et le x Hz sur ton module GPS ?

Bis repetita :grin: : c'est quoi comme module ?

jean23:
La fonction ReadBytesUntil() nécessite de connaitre la taille des trames en entrée, non ?
Du coup, j'aimerais lire des trames GPS à 5Hz, mais j'ai aucune idée de leur taille.

T'as manifestement pas bien lu la doc de ReadBytesUntil :

The function terminates if the terminator character is detected, the determined length has been read, or it times out.

jean23:
J'ai trouvé un tuto sur le forum mais il utilise aussi une String... :
http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoExpertCapteursComplexesGPSTrameSurAppuiBP
Si tu as mieux, je prends ! :wink:

Un tableau de char, tout simplement.
Ça marche tout aussi bien et ya plein de fonctions style sprintf(), sscanf(), ... qui font le boulot à ta place pour plein de chose :wink:

jean23:
Étant donné que je souhaite traiter mes données rapidement (et aussi éviter l'overflow du RX_BUFFER), je suis obligé d'utiliser le SerialEvent quand même ?

Si tu veut réellement traiter tes données à la vitesse où elles arrivent tu devrait travailler avec SerialEvent mais en utilisant une machine à états finis.

Artouste:
tu configure comment (equipement) le baudrate et le x Hz sur ton module GPS ?

Bis repetita :grin: : c'est quoi comme module ?

J'ai acheté un chip neo6 de chez ublox et ils fournissent un logiciel pour le paramétrer. Ca c'est ok.

fdufnews:
Commence par des trucs basiques pour valider la liaison.

void setup() {

Serial.begin(57600);  //  PC
  Serial1.begin(57600); // GPS
}

void loop() {
    if(Serial1.available()) {
      Serial.write(Serial1.read());
  }
}

Eeeeeeuh :roll_eyes: c'est quoi ce bordel, je reçois de la merde maintenant... J'ai du faire une bidouille dans un coin que je n'arrive pas à retrouver. Ca fonctionnait très bien mais je vais chercher cette connerie avant de vous relancer sur des problèmes de plus grande "valeur ajoutée" !!!

J'ai fait un reset de mon GPS, puis une reconfiguration, j'ai chargé un code tout fait (cf. http://arduino.cc/en/Tutorial/SerialEvent) et je n'ai même plus de signal qui passe à l'oscillo...

Si qq'un connait le neo6 j'ai peut-être fait une connerie (j'ai mis le baudrate à 9600 dans le menu PRT, et la fréquence de sortie à 2Hz dans le menu RATE, c'est tout)

J'ai plus qu'à aller courir, ça m'énerve...

J'ai acheté un chip neo6 de chez ublox

Je viens de regarder un peu la doc de ce truc. Pourquoi tu t'embêtes avec la liaison série alors que ce GPS à une liaison SPI?

fdufnews:
Je viens de regarder un peu la doc de ce truc. Pourquoi tu t'embêtes avec la liaison série alors que ce GPS à une liaison SPI?

Parce que je n'en ai jamais utilisé ! Je trouvais ça simple aux premiers abords : tu ouvres ta liaison et après tu lis, tu écris.

J'ai trouvé un vieux post qui parle du même problème que moi, non résolu : uBlox Neo 6M with Arduino - Networking, Protocols, and Devices - Arduino Forum
Ça ne m’encourage pas à continuer là-dessus... Ça doit pas être sorcier pourtant !

L'avantage du SPI c'est que c'est ton appli qui choisit le moment de lire et que tout le message arrive d'un coup. Cela permet d'avoir une meilleur maîtrise du timing de l'application. Et le SPI est plus rapide.

OK je peux essayer de faire qqchose avec ça.

Depuis quelques heures je cherche des réponses à mon problème sur internet, et je me rends compte que personne n'arrive à communiquer entre un atmega2560 et un NEO6 ! C'est ouf non !?! Il y a vraiment bcp de forum qui discutent de ce pbl. D'où vient ce "bug" de me*** ?

Si qq'un veut bien me faire mentir, et aurait réussi à récupérer des trames autres que des suites de chiffres, des symboles incohérents, ou au mieux des trames NMEA incomplètes, JE PRENDS !

Merci

jean23:
OK je peux essayer de faire qqchose avec ça.

Depuis quelques heures je cherche des réponses à mon problème sur internet, et je me rends compte que personne n'arrive à communiquer entre un atmega2560 et un NEO6 ! C'est ouf non !?! Il y a vraiment bcp de forum qui discutent de ce pbl. D'où vient ce "bug" de me*** ?

Si qq'un veut bien me faire mentir, et aurait réussi à récupérer des trames autres que des suites de chiffres, des symboles incohérents, ou au mieux des trames NMEA incomplètes, JE PRENDS !

Merci

bonjour
la question première à se (te) poser est
déja ton module NEO6 est t'il reconnu et fonctionne t'il correctement à différents baudrate et taux de refresh avec le Ucenter (dernière version) ?

  • en sortie NMEA
  • en sortie UBX (protocole proprietaire)
    ce que tu apelle module NEO6 c'est quoi exactement ? quelle référence précise exacte ? (photos ? )
    Un module que tu a soudé/cablé toi meme ?
    un PCB equipé ? acheté où/aupres de qui ?
    un evalkit de chez Ublox EVK-6xxx ? lequel exactement ?

C'est un NEO-6M-0-001. Avec le U-Center tout fonctionne.

J'utilise le chip seul sur une carte "maison" (projet étudiant en fait !), auquel j'ai ajouté une EEPROM pour la sauvegarde de la conf, exactement comme c'est expliqué dans la DS. De ce côté là, aucun problème. D'ailleurs, il n'y a vraiment qu'avec l'ATMega que ça merde :~

Artouste:

  • en sortie NMEA
  • en sortie UBX (protocole proprietaire)

Proprio mais documenté :wink:

Tu parles plutôt ce doc : http://www.u-blox.com/images/downloads/Product_Docs/u-blox6_ReceiverDescriptionProtocolSpec_(GPS.G6-SW-10018).pdf :wink:
Je ne trouve pas d'info qu'il me manquerait pour pouvoir mettre en place cette liaison série.

Je me pose la même question depuis ce matin : pourquoi aucun post n'a été résolu quand il s'agit d'un pb de liaison série entre un ATMega et un GPS Ublox ?!? On fait tous la même erreur ? :roll_eyes:

jean23:
Tu parles plutôt ce doc : http://www.u-blox.com/images/downloads/Product_Docs/u-blox6_ReceiverDescriptionProtocolSpec_(GPS.G6-SW-10018).pdf :wink:
Je ne trouve pas d'info qu'il me manquerait pour pouvoir mettre en place cette liaison série.

Je me pose la même question depuis ce matin : pourquoi aucun post n'a été résolu quand il s'agit d'un pb de liaison série entre un ATMega et un GPS Ublox ?!? On fait tous la même erreur ? :roll_eyes:

à suivre pour moi plus tard
mais j'aurais à ce stade de la discussion tendance à tendre vers une limitation de l'ATmega (et des limites hard/soft 8 Mhz et lib/soft)

avec un simple terminal uart sur PC (ou autre machine)
tu recupere des sentences "integres" ?

Bonjour à tous,

Moi aussi je me prends un peu la tête avec les liaisons série sur Mega2560. Je n'ai pas encore testé mais il me semble que si on utilise le port Serial1 il faut écrire alors :

void SerialEvent1() {...}