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
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
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 !
É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 ?
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 !
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 ?
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.
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
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.
Eeeeeeuh 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)
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.
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 !
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 :~
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 ?
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 ?
à 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" ?
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 :