Détecter dans le port Serial

Bonjour j’aimerai détecter dans le port Serial la venue d’un groupe de caractère .
Je m’explique :

Je programme un GSM, et je veux recevoir un sms .Quand je recois et un sms dans le port Serial s’affiche ceci: +CMTI “SM”:k
k correspond à un nombre celui de la mémoire où est affiché la sms .
J’aimerai détecter quand +CMTI est écrit enregistré le tout dans un tableau et en ressortir k pour l’écrire dans une AT commande .

J’ai testé plusieurs codes qui ont malheureusement pas marché . Mon code de départ étant :

mon code ici :

include <SoftwareSerial.h>

SoftwareSerial GRPS(7, 8);
;

void setup() {
  GRPS.begin(9600);
  Serial.begin(9600);
  delay(5000);
  Serial.write("r");
}





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


  
}
[\code]

A LIRE POUR LA ENIEME FOIS

Je ressort ce topic car en ayant beaucoup de recherche je ne trouve pas la solution ;(

jesuisjesus: Je ressort ce topic car en ayant beaucoup de recherche je ne trouve pas la solution ;(

Hello,

C'est un peu difficile de comprendre ce que tu veux, le code que tu as poster se contente de faire suivre entre GPS et Serial, dans les deux sens?

Tu veux détecter la séquence +CMTI dans ce que tu lis du GPS? Comment sais-tu quand "k" est terminé? Il te faut soit connaître la longueur à l'avance, soit lire jusqu'à un caractère d'arrêt (la doc du GPS devrait te donner ça).

Franck

Voici quelque chose pour démarrer... pas testé, je sais juste que ça compile :)

Tu peux définir d'autres commandes (NUM_COMMANDS et COMMANDS). Le code lit seulement un byte par cycle, pas sûr que ça marche très bien, il vaudrait peut-être mieux utiliser readBytes - appelles simplement parse() pour chaque caractère lu.

Franck

char COMMAND[] = "+CMTI \"SM\":";
// Tracks how many matching chars we've received so far
uint8_t _matches;

void setup()
{
  _matches = 0;
}

void loop() {
  while (Serial.available()) {
    if (parse(Serial.read())) {
      int k = Serial.parseInt();
      handleCMTI(k);
    }
  }
}

// Returns true iff COMMAND was detected
void parse(int c)
{
  if (COMMAND[_matches] == c) {
    // We have a match, advance our pointer
    _matches += 1;
    if (_matches == strlen(command)) {
      _matches = 0;
      return true;
    }
  }
  else {
    // mismatch, reset our pointer
    *matches = 0;
  }
  return false;
}

Je uis désolé mais je ne comprend pas votre code ni le matches ou encore uint8_t je prefere vous demander plutot que d’aller chercher si Internet car je peux sur quleque chose de faux .

J’ai peut-être trouvé quelque chose par contre

#include<SoftwareSerial.h>

SoftwareSerial GRPS (7, 8);


  String val;




void setup()
{
  Serial.begin(9600);
   GRPS.begin(9600);    
}


  

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

   if (Serial.available()) {
    GRPS.write((char)Serial.read());
}
}

void serialEvent()
{
  while (Serial.available())
  {
    
    val=(char)Serial.read();
    if (val.startsWith("+CMTI"))
    {
      char tab[15];
      val=tab[15];
      Serial.write("sms");
    }
   /* else
    {
      Serial.write((char)GRPS.read());
    }*/
  }
}

[\code]

Salut Jesuis,

Sans vouloir t'offenser je te recommande de commencer par passer un peu de temps dans des tutoriels sur la programmation en C. Ce que tu cherches à faire n'est pas complètement trivial et au vu de ton code je pense que tu vas être un peu juste côté programmation...

Franck

Oui merci je me suis rendu compte que je suis un novice en programmation ;) mais ceci est pour un TPE et j'ai pris du retard . Ceci est un élèment central de mon code donc je ne peux pas passer à coté ni prendre la temps d'apprendre le C ( nous avons quelques bases )

Mais merci de votre réponse !

jesuisjesus: Oui merci je me suis rendu compte que je suis un novice en programmation ;) mais ceci est pour un TPE et j'ai pris du retard . Ceci est un élèment central de mon code donc je ne peux pas passer à coté ni prendre la temps d'apprendre le C ( nous avons quelques bases )

Mais merci de votre réponse !

comment veux comprendre et expliquer un code sans un minimum de bases? si tu cherchais un peu plus les commandes AT gsm ? avec une commande AT+CMGR= et une petite routine, tu as de suite le numéro index du sms

recherches recevoir sms arduino sur le net, c'est pas ce qui manque

Je sais que je dois utiliser l’AT commande : AT+CMGR mais à celle-ci on doit rajouter l’endroit où se trouve le sms et c’est cela que je veux récuperer .
Comme cela doit marcher automatique, je veux que cela le fasse tout seul .
Or pour marcher une AT+CMGR doit savoir l’endroit de location du message

"Reading a message
To list a single message, you have to use the read command. You must use the list command first, so you know the indexes of the messages in the storage. For instance, to read the message on memory location ‘2’ use: "

Donc de la, je dois récupérer la location qui est donné par +CMTI: “SM”:k qui est envoyé par la SIM et c’est cela que je voudrais récupérer

Voila un autre code sur lequel j’ai travaillé :

De la, je ne reçois que sms+ mais à cause de la string qui est qu’un caractère donc je ne peux pas mettre dans un tableau char . Je vais continuer la-dessus

#include<SoftwareSerial.h>

SoftwareSerial GRPS (7, 8);


String val;




void setup()
{
  Serial.begin(9600);
   GRPS.begin(9600);  
   GRPS.write("AT+CPIN=\"1201\"""\r");  
}


  

void loop()
{
  if (GRPS.available())
  {
    val="";
    Serial.print(val);
  }

   if (Serial.available())
   {
    GRPS.write((char)Serial.read());
}
}

void serialEvent()
{
  while (Serial.available())
  {
    
    val=(char)GRPS.read();
   if (val.startsWith("+"))
   
    {
      //char tab[15];
    //  int i;
    /*  for (i=0;i!=15;i++)
      {
      val=tab[i];
      }*/
      Serial.write("sms : ");
     
     
       // Serial.write(tab[15]);
      
      
    }
   // Serial.print(val);
    }
    val="";
  }

[\code]

Je pense que tu vas avoir beaucoup de mal, mais bon, dernier essai:

Dans mon code: - tu peux remplacer partout unit8_t par byte ou int, ça marchera pareil - _matches commence à zero (on a rien vu encore) après avoir reçu "+CM"par exemple _matches vaut 3: on a reçu les 3 premiers caractères de la commande. Si le caractère suivant n'est pas 'T' on revient à zéro

Dans ton code, tu ne peux pas écrire

val=(char)Serial.read();

D'une part Serial.read() ne retourne qu'un octet (un caractère) au mieux. D'autre part tu as déclaré var comme étant une "String" - un type plus complexe qu'une simple suite de caractères: lis un peu là-dessus.

Franck