Reception sms partiel

j ai une suite de code hexa.comment puis je vous l envoyer c est une ligne tres longue sur une seule ligne

il faudrait des retours chariot pour qu relle soit moins longue

Si vous copiez coller ça ira quand même

Mais en pratique ça veut dire que le code ne passe pas par

case '\n':  Serial.println("<<NL>>"); break;

Et donc il se peut que le module n’envoie que des CR, ce qui mettrait la pagaille

Si c’est le cas changez la fonction lireUneLigneGSM
Pour celle ci


boolean lireUneLigneGSM()
{
  static byte indiceMessage = 0;
  boolean messageEnCours = true;

  while (gsmSerial.available() && messageEnCours) {
    int c = gsmSerial.read();
    if (c != -1) {
      switch (c) {
        case '\r':
          ligneMessageGSM[indiceMessage] = '\0';      // caractère NULL de fin pour une chaîne de caractères correcte
          indiceMessage = 0;                          // préparez-vous pour la prochaine fois
          messageEnCours = false;
          break;
        case '\n':                                    // ne vous souciez pas de celui-ci
          break;
        default:
          if (indiceMessage <= tailleMaxMessage - 1) ligneMessageGSM[indiceMessage++] = (char) c; // sinon ignorez-le..
          break;
      }
    }
  }
  return !messageEnCours;
}

ca ne fonctionne plus ,j ai comme reponse 'Serial3' was not declared in this scope.c est toujours ce Serial3 qui ne fait des probleme;est elle bien declarée?

ah zut l IDE etait repassé sur une carte UNO,
maintenant sur MEGA ,le moniteur mez donne ceci
image

et quand vous envoyez un SMS?

le meme apres 4 sms

pour votre question en #110 c'est juste la plateforme qui était mauvaise, Serial3 n'existe pas sur un UNO, d'où toutes les erreurs

Pour la copie d'écran (que j'ai modifiée - le mieux serait de copier coller le texte)

➜ avez vous tronqué la fin ?
la question serait de savoir si vous recevez cela


ou cela

(c'est à dire avec une ligne vide après le SMS)

à chaque SMS

en tout cas on voit bien que le module écrit un CR et un NL soit "\r\n" à chaque fin de communication

c est ce que j ai fait ,un copier/coller sans la tronquer.

vous avez copié l'image, pas le texte :wink:

OK donc il y aurait un CR LF avant de recevoir le +CMT et la réception d'un SMS correspondrait à ce texte

Pouvez vous valider cela en effaçant le contenu du moniteur série, puis en envoyant un SMS?

oui!c est exactement ca que j ai sur le moniteur

OK.
vous pouvez poster le dernier code que vous utilisez ? (avec les balises)

const bool  verifierAppelant = false;        // à mettre à true si vous ne souhaitez que des commandes en provenance du numeroAutorise
const char* numeroAutorise = "+33614xxx2"; // votre numéro

// ----------------------------
// LES INTERFACES
// ----------------------------

const byte pintestcha = A0;           // test telerupteur chauffage.
const byte pintestcho = A1;           // test telerupteur chauffeau.

const byte relcha     =  2;           // relais chauffage.
const byte relcho     =  3;           // relais chauffeau.

const byte gsmTXpin   = 14;           // pin D7 vers Tx3 du SIM900
const byte gsmRXpin   = 15;           // pin D8 vers Rx3 du SIM900

const byte pinActivationSIM900 = 9;

// ----------------------------
// LE GSM
// ----------------------------

#define gsmSerial Serial3                           // Serial3: 15 (RX) and 14 (TX  croisé                    
const byte ctrlZ = 0x1A;
const char * ctrlZcString = "\x1A";
const char * escapecString = "\x1B";
const char * OKShortcString = "OK";
const char * OKLongcString = "OK\r\n";
char x = 0;
const uint32_t uneSeconde = 1000ul;
const byte tailleMaxMessage = 100;
char ligneMessageGSM[tailleMaxMessage + 1];       // +1 pour le '\0' à la fin de la c-string
char smsAEnvoyer[tailleMaxMessage + 1];           // +1 pour le '\0' à la fin de la c-string

const byte tailleMaxNumeroTel = 30;
char numeroAppelant[tailleMaxNumeroTel + 1];

#define gsmPrintATCommand(...)    gsmSerial.print(__VA_ARGS__)
#define gsmPrintlnATCommand(...)  gsmSerial.println(__VA_ARGS__)
#define gsmWriteATCommand(...)    gsmSerial.write(__VA_ARGS__)

void erreurFatale(const char* erreur = nullptr)
{
  Serial.print(F("Erreur. "));
  if (erreur != nullptr) Serial.print(erreur);
  Serial.println();
  Serial.flush();
  while (true) yield();
}

boolean attendreChaine(const char * marqueurDeFin, unsigned long duree, boolean bavard)
{
  int taille = strlen(marqueurDeFin);
  char bufferLocal[taille];
  int index = 0;
  boolean marqueurDeFinRecu = false;
  unsigned long maintenant;

  memset(bufferLocal, '\0', taille);

  maintenant = millis();
  while (millis() - maintenant <= duree) {
    if (gsmSerial.available() > 0) {
      if (index == taille) index = 0;
      bufferLocal[index] = (uint8_t) gsmSerial.read();
      if (bavard) Serial.print((char) bufferLocal[index]);
      marqueurDeFinRecu = true;
      for (int i = 0; i < taille; i++) {
        if (bufferLocal[(index + 1 + i) % taille] != marqueurDeFin[i]) {
          marqueurDeFinRecu = false;
          break;
        }
      }
      index++;
    }
    if (marqueurDeFinRecu) break;
  }
  return marqueurDeFinRecu;
}


boolean lireUneLigneGSM()
{
  static byte indiceMessage = 0;
  boolean messageEnCours = true;

  while (gsmSerial.available() && messageEnCours) {
    int c = gsmSerial.read();
    if (c != -1) {
      switch (c) {
        case '\r':
          ligneMessageGSM[indiceMessage] = '\0';      // caractère NULL de fin pour une chaîne de caractères correcte
          indiceMessage = 0;                          // préparez-vous pour la prochaine fois
          messageEnCours = false;
          break;
        case '\n':                                    // ne vous souciez pas de celui-ci
          break;
        default:
          if (indiceMessage <= tailleMaxMessage - 1) ligneMessageGSM[indiceMessage++] = (char) c; // sinon ignorez-le..
          break;
      }
    }
  }
  return !messageEnCours;
}

boolean gsmPrintlnBloquant(const char * command, const char * marqueurDeFin, unsigned long duree, boolean bavard = true)
{
  if (bavard) Serial.println(command);
  gsmSerial.println(command);
  return attendreChaine(marqueurDeFin, duree, bavard);
}

boolean gsmPrintBloquant(const char * command, const char * marqueurDeFin, unsigned long duree, boolean bavard = true)
{
  if (bavard) Serial.print(command);
  gsmSerial.print(command);
  return attendreChaine(marqueurDeFin, duree, bavard);
}

boolean envoiSMS(const char * noDeTel, const char * messageAEnvoyer)
{
  boolean SMSenvoye = false;

  if (gsmPrintlnBloquant("AT+CSCA=\"+3369xxxxx5\"\r", OKLongcString, uneSeconde * 5)) {  // numero du centre de message SMS,
    gsmPrintATCommand("AT+CMGS=\"");
    gsmPrintATCommand(noDeTel);
    gsmPrintlnATCommand("\"");
    gsmPrintlnATCommand(messageAEnvoyer);
    SMSenvoye = gsmPrintlnBloquant(ctrlZcString, OKLongcString, uneSeconde * 5);
  }
  return SMSenvoye;
}

// ----------------

void activerChauffage() {
  Serial.println(F("Demande Chauffage"));                      //'F' et la donnée n ira pas dans la RAM mais en memoire flash
  digitalWrite(relcha, LOW);                                   // Activez le relais chauffage.
  delay(400);
  digitalWrite(relcha, HIGH);
  delay(20);
  if (digitalRead(pintestcha) == LOW) {                        // lire l'état du telerupteur chauffage.
    strncpy(smsAEnvoyer, "CHAUFFAGE ON", tailleMaxMessage);
  } else {
    strncpy(smsAEnvoyer, "CHAUFFAGE OFF", tailleMaxMessage);
  }
  Serial.print(F("SMS A ENVOYER : ")); Serial.println(smsAEnvoyer);
}

void activerChauffeEau() {
  Serial.println(F("Demande Chauffe-eau"));
  digitalWrite(relcho, LOW);                                    // Activez le relais chauffeau.
  delay(400);
  digitalWrite(relcho, HIGH);
  delay(20);

  if (digitalRead(pintestcho) == LOW) {                         // lire l'état du telerupteur chauffeau
    strncpy(smsAEnvoyer, "CHAUFFE-EAU ON", tailleMaxMessage);
  } else {
    strncpy(smsAEnvoyer, "CHAUFFE-EAU OFF", tailleMaxMessage);
  }
  Serial.print(F("SMS A ENVOYER : ")); Serial.println(smsAEnvoyer);
}

bool gestionMessage() {
  bool commandeConnue = false;
  smsAEnvoyer[0] = '\0';

  if (verifierAppelant && (strcmp(numeroAppelant, numeroAutorise) != 0)) {
    Serial.println(F("Appelant non autorisé. Commande ignorée"));
  } else {

    if (strstr(ligneMessageGSM, "chaufa") != nullptr) {       // marche/arret chauffage.
      commandeConnue = true;
      activerChauffage();
    }
    else if (strstr(ligneMessageGSM, "chaufo") != nullptr) {  // marche/arret chauffe-eau.
      commandeConnue = true;
      activerChauffeEau();
    }

    return commandeConnue;
  }
}

// ----------------------------
// LE CODE PRINCIPAL
// ----------------------------

void setup() {
  pinMode(relcha, OUTPUT);                      // commande chauffage.
  pinMode(relcho, OUTPUT);                      // commande chauffeau.

  digitalWrite(relcha, HIGH);                   // par defaut ce relais est on.
  digitalWrite(relcho, HIGH);                   // par defaut ce relais est on.

  pinMode(pintestcho, INPUT_PULLUP);            // test telerupteur chauffeau.
  pinMode(pintestcha, INPUT_PULLUP);            // test telerupteur chauffage.

  Serial.begin(9600); Serial.println();
  gsmSerial.begin(9600);
  // on vérifie que le GSM répond bien à un AT
  if (!gsmPrintlnBloquant("AT", OKLongcString, uneSeconde * 5)) erreurFatale("Erreur GPRS Modem");
  // on passe les SMS en mode texte
  if (!gsmPrintlnBloquant("AT+CMGF=1", OKLongcString, uneSeconde * 5)) erreurFatale("AT+CMGF");
  // on passe en mode routage des SMS vers le terminal
  if (!gsmPrintlnBloquant("AT+CNMI = 1,2,0,0,0", OKLongcString, uneSeconde * 5)) erreurFatale("AT+CNMI"); // (normalement c'est 1,2,0,0,0) ??

  Serial.println("Initialisation terminée. Système Prêt.");
}

void loop() {
  if (lireUneLigneGSM()) {
    // ********************************************
    // TEST RECEPION D'UN SMS
    // +CMT: "+3361xxx002","","21/12/21,17:28:41+04"<CR><LF>
    // le texte du message<CR><LF>
    //<CR><LF>
    // ********************************************
    if (!strncmp(ligneMessageGSM, "+CMT:", 5)) {      //la ligne commence-t-elle par +CMT:
      Serial.print(F("RECEPTION SMS = [")); Serial.print(ligneMessageGSM); Serial.println(F("]"));
      const char *ptr = strchr(ligneMessageGSM + 7, '\"');
      if (ptr) {
        byte l = min(ptr - (ligneMessageGSM + 7), tailleMaxNumeroTel);
        strncpy(numeroAppelant, ligneMessageGSM + 7, l);
        numeroAppelant[l] = '\0';
      } else numeroAppelant[0] = '\0';
      Serial.print(F("APPELANT = [")); Serial.print(numeroAppelant); Serial.println(F("]"));
      while (!lireUneLigneGSM());                    // on attend le texte du SMS
      bool commandeConnue = gestionMessage();
      if (!commandeConnue) {
        Serial.print(F("Commande Inconnue [")); Serial.print(ligneMessageGSM); Serial.println(F("]"));
      }
      while (!lireUneLigneGSM());                   // on attend une ligne vide
      // ici le Module est à nouveau dispo
      if (commandeConnue) envoiSMS(numeroAppelant, smsAEnvoyer);
    } else {
      Serial.print(F("LIGNE IGNOREE = [")); Serial.print(ligneMessageGSM); Serial.println(F("]"));
    }
  }
}

essayez avec cela (il faut remettre les bons N° de tel aux bons endroits)

const bool  verifierAppelant = false;        // à mettre à true si vous ne souhaitez que des commandes en provenance du numeroAutorise
const char* numeroAutorise = "+33614xxx2"; // votre numéro

// ----------------------------
// LES INTERFACES
// ----------------------------

const byte pintestcha = A0;           // test telerupteur chauffage.
const byte pintestcho = A1;           // test telerupteur chauffeau.

const byte relcha     =  2;           // relais chauffage.
const byte relcho     =  3;           // relais chauffeau.

const byte gsmTXpin   = 14;           // pin D7 vers Tx3 du SIM900
const byte gsmRXpin   = 15;           // pin D8 vers Rx3 du SIM900

// ----------------------------
// LE GSM
// ----------------------------
#define gsmSerial Serial3                           // Serial3: 15 (RX) and 14 (TX  croisé                    
const char * ctrlZcString = "\x1A";
const char * OKLongcString = "OK\r\n";
const uint32_t uneSeconde = 1000ul;
const byte tailleMaxMessage = 100;
char ligneMessageGSM[tailleMaxMessage + 1];       // +1 pour le '\0' à la fin de la c-string
char smsAEnvoyer[tailleMaxMessage + 1];           // +1 pour le '\0' à la fin de la c-string

const byte tailleMaxNumeroTel = 30;
char numeroAppelant[tailleMaxNumeroTel + 1];

#define gsmPrintATCommand(...)    gsmSerial.print(__VA_ARGS__)
#define gsmPrintlnATCommand(...)  gsmSerial.println(__VA_ARGS__)
#define gsmWriteATCommand(...)    gsmSerial.write(__VA_ARGS__)

void erreurFatale(const char* erreur = nullptr)
{
  Serial.print(F("Erreur. "));
  if (erreur != nullptr) Serial.print(erreur);
  Serial.println();
  Serial.flush();
  while (true) yield();
}

boolean attendreChaine(const char * marqueurDeFin, unsigned long duree, boolean bavard)
{
  int taille = strlen(marqueurDeFin);
  char bufferLocal[taille];
  int index = 0;
  boolean marqueurDeFinRecu = false;
  unsigned long maintenant;

  memset(bufferLocal, '\0', taille);

  maintenant = millis();
  while (millis() - maintenant <= duree) {
    if (gsmSerial.available() > 0) {
      if (index == taille) index = 0;
      bufferLocal[index] = (uint8_t) gsmSerial.read();
      if (bavard) Serial.print((char) bufferLocal[index]);
      marqueurDeFinRecu = true;
      for (int i = 0; i < taille; i++) {
        if (bufferLocal[(index + 1 + i) % taille] != marqueurDeFin[i]) {
          marqueurDeFinRecu = false;
          break;
        }
      }
      index++;
    }
    if (marqueurDeFinRecu) break;
  }
  return marqueurDeFinRecu;
}


boolean lireUneLigneGSM() {
  static byte indiceMessage = 0;
  boolean messageEnCours = true;

  while (gsmSerial.available() && messageEnCours) {
    int c = gsmSerial.read();
    if (c != -1) {
      switch (c) {
        case '\n':
          ligneMessageGSM[indiceMessage] = '\0';      // caractère NULL de fin pour une chaîne de caractères correcte
          indiceMessage = 0;                          // préparez-vous pour la prochaine fois
          messageEnCours = false;
          break;
        case '\r':                                    // ne vous souciez pas de celui-ci
          break;
        default:
          if (indiceMessage <= tailleMaxMessage - 1) ligneMessageGSM[indiceMessage++] = (char) c; // sinon ignorez-le..
          break;
      }
    }
  }
  return !messageEnCours;
}

boolean gsmPrintlnBloquant(const char * command, const char * marqueurDeFin, unsigned long duree, boolean bavard = true) {
  if (bavard) Serial.println(command);
  gsmSerial.println(command);
  return attendreChaine(marqueurDeFin, duree, bavard);
}

boolean gsmPrintBloquant(const char * command, const char * marqueurDeFin, unsigned long duree, boolean bavard = true) {
  if (bavard) Serial.print(command);
  gsmSerial.print(command);
  return attendreChaine(marqueurDeFin, duree, bavard);
}

boolean envoiSMS(const char * noDeTel, const char * messageAEnvoyer) {
  boolean SMSenvoye = false;

  if (gsmPrintlnBloquant("AT+CSCA=\"+336xxx695\"\r", OKLongcString, uneSeconde * 5)) {  // numero du centre de message SMS,
    gsmPrintATCommand("AT+CMGS=\"");
    gsmPrintATCommand(noDeTel);
    gsmPrintlnATCommand("\"");
    gsmPrintlnATCommand(messageAEnvoyer);
    SMSenvoye = gsmPrintlnBloquant(ctrlZcString, OKLongcString, uneSeconde * 5);
  }
  return SMSenvoye;
}

// ----------------

void activerChauffage() {
  Serial.println(F("Demande Chauffage"));                      //'F' et la donnée n ira pas dans la RAM mais en memoire flash
  digitalWrite(relcha, LOW);                                   // Activez le relais chauffage.
  delay(400);
  digitalWrite(relcha, HIGH);
  delay(20);
  if (digitalRead(pintestcha) == LOW) {                        // lire l'état du telerupteur chauffage.
    strncpy(smsAEnvoyer, "CHAUFFAGE ON", tailleMaxMessage);
  } else {
    strncpy(smsAEnvoyer, "CHAUFFAGE OFF", tailleMaxMessage);
  }
  Serial.print(F("SMS A ENVOYER : ")); Serial.println(smsAEnvoyer);
}

void activerChauffeEau() {
  Serial.println(F("Demande Chauffe-eau"));
  digitalWrite(relcho, LOW);                                    // Activez le relais chauffeau.
  delay(400);
  digitalWrite(relcho, HIGH);
  delay(20);

  if (digitalRead(pintestcho) == LOW) {                         // lire l'état du telerupteur chauffeau
    strncpy(smsAEnvoyer, "CHAUFFE-EAU ON", tailleMaxMessage);
  } else {
    strncpy(smsAEnvoyer, "CHAUFFE-EAU OFF", tailleMaxMessage);
  }
  Serial.print(F("SMS A ENVOYER : ")); Serial.println(smsAEnvoyer);
}

bool gestionMessage() {
  bool commandeConnue = false;
  smsAEnvoyer[0] = '\0';

  if (verifierAppelant && (strcmp(numeroAppelant, numeroAutorise) != 0)) {
    Serial.println(F("Appelant non autorisé. Commande ignorée"));
  } else {

    if (strstr(ligneMessageGSM, "chaufa") != nullptr) {       // marche/arret chauffage.
      commandeConnue = true;
      activerChauffage();
    }
    else if (strstr(ligneMessageGSM, "chaufo") != nullptr) {  // marche/arret chauffe-eau.
      commandeConnue = true;
      activerChauffeEau();
    }

    return commandeConnue;
  }
}

// ----------------------------
// LE CODE PRINCIPAL
// ----------------------------

void setup() {
  pinMode(relcha, OUTPUT);                      // commande chauffage.
  pinMode(relcho, OUTPUT);                      // commande chauffeau.

  digitalWrite(relcha, HIGH);                   // par defaut ce relais est on.
  digitalWrite(relcho, HIGH);                   // par defaut ce relais est on.

  pinMode(pintestcho, INPUT_PULLUP);            // test telerupteur chauffeau.
  pinMode(pintestcha, INPUT_PULLUP);            // test telerupteur chauffage.

  Serial.begin(9600); Serial.println();
  gsmSerial.begin(9600);
  // on vérifie que le GSM répond bien à un AT
  if (!gsmPrintlnBloquant("AT", OKLongcString, uneSeconde * 5)) erreurFatale("Erreur GPRS Modem");
  // on passe les SMS en mode texte
  if (!gsmPrintlnBloquant("AT+CMGF=1", OKLongcString, uneSeconde * 5)) erreurFatale("AT+CMGF");
  // on passe en mode routage des SMS vers le terminal
  if (!gsmPrintlnBloquant("AT+CNMI = 1,2,0,0,0", OKLongcString, uneSeconde * 5)) erreurFatale("AT+CNMI"); // (normalement c'est 1,2,0,0,0) ??

  Serial.println("Initialisation terminée. Système Prêt.");
}

void loop() {
  if (lireUneLigneGSM()) {
    // ********************************************
    // TEST RECEPION D'UN SMS
    // <CR><LF>
    // +CMT: "+33614xxx2","","21/12/21,17:28:41+04"<CR><LF>
    // le texte du message<CR><LF>
    //
    // ********************************************
    if (!strncmp(ligneMessageGSM, "+CMT:", 5)) {      //la ligne commence-t-elle par +CMT:
      Serial.print(F("RECEPTION SMS = [")); Serial.print(ligneMessageGSM); Serial.println(F("]"));
      const char *ptr = strchr(ligneMessageGSM + 7, '\"');
      if (ptr) {
        byte l = min(ptr - (ligneMessageGSM + 7), tailleMaxNumeroTel);
        strncpy(numeroAppelant, ligneMessageGSM + 7, l);
        numeroAppelant[l] = '\0';
      } else numeroAppelant[0] = '\0';
      Serial.print(F("APPELANT = [")); Serial.print(numeroAppelant); Serial.println(F("]"));
      while (!lireUneLigneGSM());                    // on attend le texte du SMS
      bool commandeConnue = gestionMessage();
      if (!commandeConnue) {
        Serial.print(F("Commande Inconnue [")); Serial.print(ligneMessageGSM); Serial.println(F("]"));
      } else envoiSMS(numeroAppelant, smsAEnvoyer);
    } else {
      Serial.print(F("LIGNE IGNOREE = [")); Serial.print(ligneMessageGSM); Serial.println(F("]"));
    }
  }
}

pas d erreur a la compilation mais toujours Erreur GPRS modem

On fait

vous ne l'aviez pas passé en 19200 bauds ?
on a aussi viré l'initialisation. Vous n'avez pas de câble pour la pin pinActivationSIM900 ?

c est a n y rien comprendre! je l ai repassé a 19200 ca a marché impecable,j ai envoyé un sms assez bien ,au deuxieme sms plus rien et Erreur GPRS modem de retour

Si vous voyez cela c'est que l'arduino a planté car ce n'est fait que dans le setup()

débranchez toutes les commandes réelles allant vers les relais pour voir si ça crée un souci

voila ce que j ai constaté:je demarre tout (mega et sim900),la tout va bien,puis j envoi un sms ,je le recois bien et tout a l air bon.au deuxieme sms plus rien.alors j ai debranché la sim de son alim et je l ai redemarrée tout rentre dans l ordre pour un seul sms et ainsi de suite.on dirait que la sim ,apres la premiere commande, fait quelquechose,peut etre plantée dans une boucle??

est-ce que vous faites le test avec les relais débranchés (pour vous assurer qu'il n'y a aucune perturbation)?

l'alim de la SIM est bien capable de fournir 2A ?