Demande d'explication

Quand je lance ce sketch j'obtiens toujours "choix =0" quelque soit la lettre envoyée
Pourquoi?


#include <SoftwareSerial.h>

char inchar;
int choix;

SoftwareSerial mySerial(5, 6);  // 2=TX 3=RX

void setup() {

  // vitesses
  mySerial.begin(19200);  // vitesse SIM900
  Serial.begin(9600);     // vitesse moniteur
}

void loop() {

  if (mySerial.available() > 0) {
    inchar = mySerial.read();
    delay(50);

    if (inchar == 'T') {
      choix = 1;
    }
    if (inchar == 'R') {
      choix = 2;
    }
  Serial.print ("choix =");
  Serial.print(choix);

    switch (choix) {

      case 1:
        Serial.print("choix T =");
        Serial.print(choix);
        break;
      case 2:
        Serial.print("choix R =");
        Serial.print(choix);
        break;
    }
  }
}

Comment envoyez vous les données sur le port série my serial?

PS:

Toujours un commentaire "idiot"…

Par gsm
Quand je visualise le "inchar" reçu, j'ai un signe cabalistique ressemblant à un point d'interrogation sur fond noir

Affichez inChar en numérique pour voir le code reçu réellement

Serial.print((byte) inChar);

Vous êtes sûr des débits ? (19200???)

Votre gsm doit afficher autre chose que le contenu du sms et ne faut il pas le mettre en mode texte?

quelque soit la lettre envoyée je lis en numérique
inchar =255

Pas de changement même en ajoutant ces lignes

mySerial.println("AT+CMGF=1");  //mise du GSM en mode TEXTE SMS
    delay(1000);
  mySerial.println("AT+CMGS=\"xxxxxxxx\"\r");  // numero GSM
    delay(1000);

Si vous lisez 255 c’est sans doute que la valeur du read était -1 (0xFFFF et en prenant un seul octet vous avez 0xFF qui fait -1 sur un char) qui marque une erreur

La réception se passe mal. Le module est il bien à 19200 bauds ? Êtes vous branché sur 2 et 3 ou 5 et 6 ?…

Ce n'est pas très futé de sortir plus lentement que la vitesse de réception des données.
Passer 115200. comme paramètre à Serial.begin()

Désolé, je l'avais déjà testé mais ça ne marche pas.. donc ce n'est pas la bonne explication
D'ailleurs, c'est la 1ere fois que je lis que la vitesse du Serial doit être supérieure au mySerial ... tous les sketchs semblables publiés sur le web fonctionnent avec mes choix de vitesse
La preuve est que mon autre sketch sur la mesure de la T° par gsm avec ces chiffres fonctionne parfaitement :
les conditions y étaient réalisée par des "if"
C'est mon expérimentation par le "switch-case" qui ne fonctionne pas d'où ma question

Ce n'est pas difficile à comprendre actuellement, pour 1 caractère que tu reçois de mySerial, tu en écris 12 et 2 fois plus lentement sur Serial. Donc tu peux assez rapidement saturer le buffer d'émission d'ou l'intérêt de sortir plus rapidement que le débit en réception.

Il faudrait retirer le delay(50). Mettre un delais de 50ms alors que les caractères arrivent environ toutes les 500μs ce n'est pas non plus une bonne idée.

Je prends bonne note de tes conseils plutôt logiques pour mes prochains projets

Il est temps que je vous explique le but de ce petit scketch que j'expérimente pour apprendre

Je voudrais convertir un caractère , "A" par exemple, envoyé de mon gsm en une autre lettre "R" dès son arrivée dans l'arduino pour être ensuite traitée

Comment feriez-vous?

Il faudrait déjà recevoir correctement les lettres

Ensuite oui c’est tout bête

char recu = recupererPochainCaractere();
if (recu == 'A') recu = 'R';

Si j'ai bien appliqué vos lignes dans mon sketch que voici ... cela ne donne malheureusement rien non plus

#include <SoftwareSerial.h>

SoftwareSerial mySerial(5, 6);

void setup() {
  // vitesses
  mySerial.begin(9600);  // vitesse SIM900
  Serial.begin(19200);    // vitesse moniteur
}

void loop() {

  if (mySerial.available() > 0) {
    char recu = mySerial.read();

    if (recu == 'V') {
      recu = 'T';
    }
    if (recu == 'Z') {
      recu = 'R';
    }

    switch (recu) {
      case 'T':
        Serial.print("Temperature");
        break;
      case 'R':
        Serial.print("reset ");
        break;
    }
  }
}

A mon avis vous ne recevez rien de cohérent... Tant que ce n'est pas réglé, le code ne fonctionnera pas

Chargez ce code et ouvrez le moniteur série à 115200 bauds (ça ne sert à rien d'aller lentement pour l'affichage) :

#include <SoftwareSerial.h>
SoftwareSerial mySerial(5, 6);

void setup() {
  mySerial.begin(9600);    // vitesse SIM900
  Serial.begin(115200);    // vitesse moniteur
}

void loop() {
  if (mySerial.available() > 0) {
    char recu = mySerial.read();
    if (isPrintable(recu)) {
      Serial.write(recu);
    } else {
      Serial.write("[0x");
      if (recu < 0x10) Serial.write('0');
      Serial.print((byte) recu, HEX);
      Serial.write(']');
    }
}

que voyez vous quand vous envoyez un SMS ?

En reprenant sans retouche (si ce n'est une accolade manquante) votre sketch , le monitor affiche [0x0FF]

OK - est-ce qu'il n'affiche que ça ?

modifiez le sketch pour faire

#include <SoftwareSerial.h>
SoftwareSerial mySerial(5, 6);

void setup() {
  mySerial.begin(9600);    // vitesse SIM900
  Serial.begin(115200);    // vitesse moniteur
}

void loop() {
  if (mySerial.available() > 0) {
    int recu = mySerial.read();
    if (recu == -1) {
      Serial.print("[erreur]");
    } else if (isPrintable(recu)) {
      Serial.write((char) recu);
    } else {
      Serial.write("[0x");
      if (recu < 0x10) Serial.write('0');
      Serial.print((byte) recu, HEX);
      Serial.write(']');
    }
  }
}

En tapant T

[0x0D][0x0A]+CMT: "+xxxxxxxxx","","25/01/21,15:34:53+04"[0x0D][0x0A]T[0x0D][0x0A]

AH c'est bien ça !!! :slight_smile:

[0x0D][0x0A] c'est CR LF, un passage à la ligne
+CMT: "+xxxxxxxxx","","25/01/21,15:34:53+04" c'est le module qui dit que vous recevez un SMS
[0x0D][0x0A] c'est CR LF, un un nouveau passage à la ligne
T c'est votre message
[0x0D][0x0A] est un nouveau passage à la ligne qui veut dire que vous avez fini la réception.

vous ne pouvez pas juste tester la présence de 'T' car vous l'avez dans +CMT. Comme je l'ai déjà dit, le mieux serait de recevoir toute la réponse, puis de l'analyser.

Vous essayez ou vous voulez un sketch minimaliste qui le fait ?

tenez essayez cela :wink:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(5, 6);

const byte tailleMax = 250;
char message[tailleMax];

bool messageDispo() {
  static unsigned long dernierTemps = 0;
  static byte index = 0;

  while (mySerial.available()) {
    char c = mySerial.read();
    if (index < tailleMax - 1) {
      message[index++] = c;
    }
    dernierTemps = millis();
  }

  if (millis() - dernierTemps > 250 && index > 0) {
    message[index] = '\0'; // Terminer la chaîne
    index = 0;
    return true;
  }
  
  return false;
}


void setup() {
  mySerial.begin(9600);    // vitesse SIM900
  Serial.begin(115200);    // vitesse moniteur
  Serial.println("PRET");
}

void loop() {
  if (messageDispo()) {
    for (byte i = 0; i < tailleMax && message[i] != '\0'; i++) {
      char recu = message[i];
      if (isPrintable(recu)) {
        Serial.write(recu);
      } else {
        Serial.write("[0x");
        if (recu < 0x10) Serial.write('0');
        Serial.print((byte) recu, HEX);
        Serial.write(']');
      }
    }
    Serial.println();
  }
}