Reception de SMS

(deleted)

Si vous voulez comprendre comment écouter le port série vous pouvez jeter un oeil à mon petit tuto sur le sujet, il y’a des références à du code pour extraire des données d’un message

Il y’a les fonctions des bibliothèques standard que vous pouvez utiliser cf stdlib.h Et string.h

(deleted)

(deleted)

mieux vaut persévérer , avec Raspberry ça ne se fera pas tout seul et ne sera pas plus facile quelque soit la voie suivie.

(deleted)

vous devez écrire un bout de code qui commence par écouter la réponse de votre module jusqu'au OK ou mot de fin.

Cette réponse va contenir

[color=blue]xxxxx[/color]
[color=red]+CMT: "+336000000000","","20/03/16,18:08:36+04"[/color]
[color=green]BLABLABLA[/color]
[color=blue]xxxxx[/color]

vous voulez récupérer ce qui est sur la ligne après la ligne qui commence avec +CMT

donc il faut trouver la ligne qui commence par +CMT et quand vous l'avez trouver prendre la ligne suivante (ou plus parce qu'un message SMS peut aussi passer à la ligne, donc à mon avis plutôt lire jusqu'au marqueur de fin)

la fonction strstr() peut chercher une chaine dans une autre, utilisez cela pour trouver le +CMT

ensuite trouvez le "\r\n" ou ce qui est utilisé pour passer à la ligne et enfin cherchez le mot clé de fin (sans doute "OK\r\n") --> ce qui est entre le passage à la ligne et le mot clé de fin est votre message SMS

(deleted)

; le strstr me fait des erreurs …

analysez les erreurs , montrez les içi , corrigez les

voici un exemple avec strstr()

char messageRecu[] = "des trucs qui trainent avant le message\r\n+CMT: \"+336000000000\",\"\",\"20/03/16,18:08:36+04\"\r\nCeci est le texte du SMS\r\nqui dans le cas present\r\ntient sur trois lignes\r\n\r\nOK\r\n";

const uint8_t tailleMaxSMS = 100;

char textDuSMS[tailleMaxSMS + 1]; // +1 pour le '\0' de fin

void setup() {
  Serial.begin(115200);
  
  Serial.println(F("On doit analyser cela:"));
  Serial.println(messageRecu);
  Serial.println(F("---------------------"));

  char* ptrCMT = strstr(messageRecu, "+CMT:");  // on cherche +CMT:
  char* ptrFinLigneCMT = strstr(ptrCMT, "\r\n"); // on cherche le passage à la ligne qui suit
  char* ptrFinSMS = strstr(ptrFinLigneCMT, "OK\r\n");// on cherche la fin du message

  if (ptrCMT && ptrFinLigneCMT && ptrFinSMS) { // si on a bien tout reçu
    strncpy(textDuSMS, ptrFinLigneCMT + 2, min(ptrFinSMS - ptrFinLigneCMT - 6, tailleMaxSMS)); // +2 pour sauter le \r\n et -6 pour tenir compte de ces 2, de la fin de ligne du SMS et de la ligne vide
    textDuSMS[tailleMaxSMS] = '\0'; // juste au cas où
    Serial.print(F("Texte du SMS:\r\n[["));
    Serial.print(textDuSMS);
    Serial.println(F("]]"));
  } else {
    Serial.println(F("Erreur Analyse du message"));
  }
}

void loop() {}

la console série ouverte à 115200 bauds dira:

On doit analyser cela:
[color=purple]des trucs qui trainent avant le message
[color=green]+CMT:[/color] "+336000000000","","20/03/16,18:08:36+04"
[color=red]Ceci est le texte du SMS
qui dans le cas present
tient sur trois lignes[/color]

[color=green]OK[/color]

---------------------
Texte du SMS:
[[[color=red]Ceci est le texte du SMS
qui dans le cas present
tient sur trois lignes[/color]]]
[/color]

j'ai mis en couleur les truc que je recherche sauf la fin de ligne qu'on ne voit pas

(deleted)

davidgi08:
Effectivement, c'est exactement ce que je veux faire mais j'ai un soucis car je recupére mon message sous cette forme :

messageRecu = sim900.readString();

et probleme entre String et char

D'une part essayez d'éviter les String et surtout readString...ça lit ce qui arrive jusqu'à un timeOut donc vous n'avez aucun contrôle réel et vous devez prier pour que tout soit lu correctement...

si vous voulez tester avec ce que vous avez — sans garantie de ce qui se trouve dans votre messageRecu — vous pouvez faire l'analyse sur messageRecu.c_str() qui est le pointeur sur le buffer mémoire (c'est pas propre du tout et un gros hack mais devrait marcher) ou au lieu d'utiliser strstr() il faut utiliser les fonctions équivalentes de la classe String. --> je vous laisse lire la doc de la classe et notamment la méthode indexOf()

Dans l'absolu cependant, ne récupérez pas la réponse comme cela. Allez jeter un oeil à mon petit tuto sur le sujet du port série et mettez dans messageRecu tout ce qui correspond à la réponse, jusqu'au "\r\nOK\r\n" final. faudra coder un peu (ou recherchez un peu sur le forum, j'ai déjà posté des codes qui écoutent jusqu'à une phrase clé) et vous pourrez alors utiliser cette approche avec les cString, sans risque de morcellement mémoire et en étant sûr de ce que vous avez reçu, s'il y a eu timeout ou pas etc... ==> votre code sera robuste.