jo_6466
January 20, 2025, 10:26pm
1
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;
}
}
}
J-M-L
January 20, 2025, 10:29pm
2
Comment envoyez vous les données sur le port série my serial?
PS:
Toujours un commentaire "idiot"…
jo_6466
January 20, 2025, 10:31pm
3
jo_6466:
S
Par gsm
Quand je visualise le "inchar" reçu, j'ai un signe cabalistique ressemblant à un point d'interrogation sur fond noir
J-M-L
January 20, 2025, 10:34pm
4
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?
jo_6466
January 20, 2025, 10:37pm
5
quelque soit la lettre envoyée je lis en numérique
inchar =255
jo_6466
January 20, 2025, 10:43pm
6
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);
J-M-L
January 21, 2025, 4:19am
7
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()
jo_6466
January 21, 2025, 10:16am
9
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.
jo_6466
January 21, 2025, 11:55am
11
fdufnews:
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
jo_6466
January 21, 2025, 11:59am
12
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?
J-M-L
January 21, 2025, 12:49pm
13
Il faudrait déjà recevoir correctement les lettres
Ensuite oui c’est tout bête
char recu = recupererPochainCaractere();
if (recu == 'A') recu = 'R';
jo_6466
January 21, 2025, 2:09pm
14
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;
}
}
}
J-M-L
January 21, 2025, 2:20pm
15
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 ?
jo_6466
January 21, 2025, 2:26pm
16
J-M-L:
#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(']');
}
}
En reprenant sans retouche (si ce n'est une accolade manquante) votre sketch , le monitor affiche [0x0FF]
J-M-L
January 21, 2025, 2:32pm
17
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(']');
}
}
}
jo_6466
January 21, 2025, 2:35pm
18
J-M-L:
#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]
J-M-L
January 21, 2025, 2:42pm
19
AH c'est bien ça !!!
[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 ?
J-M-L
January 21, 2025, 2:57pm
20
tenez essayez cela
#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();
}
}