problème de lecture du port série sur un module GSM TC35i

Bonjour,
Je viens de passer une après midi à galérer (je suis débutant, j'en suis à quelques applications déjà développées).

Je veux lire sur une carte GSM TC35i des SMS. A partir d'une arduino méga.

Pour cela, je lance la commande AT suivante :
AT+CMGL="ALL"\r
(commande qui affiche tous les SMS en mémoire)

Cela marche sans problème, le modem TC35i répond.

Pour afficher la réponse, dans ma boucle principale, j'utilise ce code (le TC35i étant sur le serial3 de ma MEGA) :

while(Serial3.available()!=0)          // quand il y a des données en provenance du modem
{                                      // je les affiche sur le moniteur série
 Serial.print(char(Serial3.read()));   //
}                                      //

Je rencontre alors le problème suivant :
Si je commande plusieurs fois de suite la lecture des SMS, je n'obtiens pas le même résultat à chaque fois dans le moniteur série.
Des caractères sautent, aléatoirement.
Ce n'est pas répétable...

J'ai l'impression d'avoir un problème de principe dans ma lecture de données sur le port série.
J'ai essayé de mettre des fonctions delay, mais rien n'y fait.
Au bout de 60 à 80 caractères affichés, ça saute des caractéres.
Pouvez vous m'aiguiller SVP ?

Exemple de ce que j'obtiens sur le moniteur série, qui devrait être la même chose à chaque fois, mais qui ne l'est pas !
(dès la troisième ligne, il y a un bug car elle se finie par 1, au lieu de se finir par un horodatage)

AT+CMGL="ALL"

+CMGL: 1,"REC READ","+336350xxxxx",,"16/03/13,1
+CMGL: 3,"REC READ","+336350xxxxx",,"16/03/13,16:18:03+04"
Essai 01
+CMGL: 4,"REC READ","+336350xxxxx",,"16/03/13,16:38:47+04"
Essai 02
+CMGL: 5,"REC READ","+336350xxxxx",,"16/03/13,17:33:14+04"
Essai 03

OK
AT+CMGL="ALL"

+CMGL: 1,"REC READ","+336350xxxxx",,"16/03/13,1CMGL: 3,"REC READ","+336350xxxxx",,"16/03/13,16:18:03+04"
Essai 01
+CMGL: 4,"REC READ","+336350xxxxx",,"16/03/13,16:38:47+04"
Essai 02
+CMGL: 5,"REC READ","+336350xxxxx",,"16/03/13,17:33:14+04"
Essai 03

OK
AT+CMGL="ALL"

+CMGL: 1,"REC READ","+336350xxxxx",,"16/03/13,1
Essai 01
+CMGL: 4,"REC READ","+336350xxxxx",,"16/03/13,16:38:47+04"
Essai 02
+CMGL: 5,"REC READ","+336350xxxxx",,"16/03/13,17:33:14+04"
Essai 03

Bonsoir,

Serial.print(...) est pénalisant en terme de temps d'exécution, donc à éviter pendant la lecture du port série.

Il est préférable de remplir un tableau de caractères pour fiabiliser une lecture longue du port série. Avec un "time out" pour sortir de la fonction de lecture.

Puis dans un second temps d'utiliser ce tableau pour traiter, afficher ... les données reçues .

Bonjour,

Peut etre une piste : Le buffer de la liaison série est , a priori,de 64 octets.

Si la vitesse de:liaison série avec le moniteur est inférieure ou egale a la vitesse avec le module gsm, le buffer doit finir par se remplir : essai avec une vitesse max sur le liaison série avec le moniteur.. ça reste une supposition mais cela ne coûte rien d'essayer :slight_smile:

Pierre

Bonjour,

  • J'ai essayé de changer la vitesse du port série : malheureusement pas d'effet.

  • J'ai essayé, quand il y a du sérial de disponible, de remplir un tableau de caractères.
    Ensuite, par action sur un BP, je vide le tableau de caractères pour l'afficher.
    -> ça marche parfaitement. Je ne loupe plus aucun caractère. Merci beaucoup pour le coup de pouce.

Construisant ma petite expérience au fur et à mesure, je viens écrire ici ce que j'ai pu comprendre et observer grâce à vos judicieux conseils ci-dessus (si cela peut servir à d'autres débutant) :

  • comme mon programme a besoin de scruter des données en provenance du TC35i via le port série, j'ai supprimé tout usage de la fonction delay. En effet, si le TC35i envoie des données sur le port série, et que mon programme est occupé (par exemple par une fonction delay) : cela rempli le buffer (64 caractères) et donc je loupe des données. Ce n'est pas très bon !

  • j'ai donc intérêt à ce que ma boucle tourne le plus rapidement possible pour scruter le plus souvent possible le port série.

  • je dois donc optimiser mon code pour ne pas utiliser de procédures lentes.

J’espère ne pas avoir écrit d’âneries. :slight_smile: