mon message ne comportera toujours qu'une seule lettre envoyée
C'est
affichage dans le moniteur
PRET
[0x0FF]
mon message ne comportera toujours qu'une seule lettre envoyée
C'est
affichage dans le moniteur
PRET
[0x0FF]
vous êtes sûr d'avoir tapé le bon code ?
oui ...
J'ai trouvé ce sketch qui est un exemple proposé par arduino
Il fonctionne!
Pouvez-vous y jeter un oeil et expliquer pourquoi il fonctionne?
#include <GPRS_Shield_Arduino.h>
#include <SoftwareSerial.h>
#define MESSAGE_LENGTH 160
char message[MESSAGE_LENGTH];
int messageIndex = 0;
char phone[16];
char datetime[24];
GPRS gprs(5,6,9600); //RX,TX,PWR,BaudRate
void setup() {
gprs.checkPowerUp();
Serial.begin(9600);
while (!gprs.init()) {
Serial.print("init error\r\n");
delay(1000);
}
delay(3000);
Serial.println("Init Success, please send SMS message to me!");
}
void loop() {
messageIndex = gprs.isSMSunread();
if (messageIndex > 0) { //At least, there is one UNREAD SMS
gprs.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);
//In order not to full SIM Memory, is better to delete it
gprs.deleteSMS(messageIndex);
Serial.println(message);
}
}
la classe GPRS fait tout le boulot pour vous.
Par exemple pour voir s'il y a un SMS, ils envoient la commande AT+CMGL avec leur fonction nsim900_send_cmd puis écoutent la réponse et l'analyse.
Fausse joie
Quand je tape la lettre T (par exemple) le moniteur affiche bien T
mais quand je teste cette valeur pour la réafficher , je n'obtiens strictement rien
#include <GPRS_Shield_Arduino.h>
#include <SoftwareSerial.h>
#define MESSAGE_LENGTH 160
char message[MESSAGE_LENGTH];
int messageIndex = 0;
char phone[16];
char datetime[24];
GPRS gprs(5,6,9600); //RX,TX,PWR,BaudRate
void setup() {
gprs.checkPowerUp();
Serial.begin(115200);
while (!gprs.init()) {
Serial.print("init error\r\n");
delay(1000);
}
delay(3000);
Serial.println("Init Success, please send SMS message to me!");
}
void loop() {
messageIndex = gprs.isSMSunread();
if (messageIndex > 0) { //At least, there is one UNREAD SMS
gprs.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);
//In order not to full SIM Memory, is better to delete it
gprs.deleteSMS(messageIndex);
Serial.print("recu = ");
Serial.println(message);
}
if (message == 'T') {
Serial.print ("print = ");
Serial.println (message);
}
}
Copie le contenu de l'affichage du moniteur série.
Init Success, please send SMS message to me!
recu = T
message est un tableau de char.
Tu ne peux pas comparer un tableau de char avec un char.
if (message[0] == 'T') {Tu dois d'ailleurs avoir un warning sur cette ligne je pense.
Non aucune erreur dans le sketch avec if (message == 'T') mais cela fonctionne avec if (message[0] == 'T')
comment sait-on que l'on a affaire à un tableau de char ?
Tu déclare un tableau de char avec cette instruction.
c'est étonnant tu utilises quel version de l'IDE car moi, j'ai l'erreur suivante
Essai_10.ino:33:17: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
33 | if (message == 'T') {
| ~~~~~^
version IDE 2.2.3
ok, j'ai compris tu compiles pour un Arduino Uno et dans les "préférences" l'option "compiler warnings" est positionner à none?
J'ai compilé avec la carte "ESP32 C6", dans ce cas le fichier platform.txt de la carte n'utilise pas l'option de compilation -fpermissive.
Je te conseillerais d'au moins position la préférence "compiler warnings" à la valeur "default"
Cela te permettra au moins d'afficher les warning que le compilateur te remonte.
En effet ... modifié
Post effacé
Réservez les simples quotes (apostrophe verticale) pour un seul caractère et les guillemets pour des chaînes
char caractere = 'x' ; // un seul caractère, un octet
char chaineDeCaracteres[20] = "x";// une tableau de 20 octets initialisé avec le caractère x en premier et un caractère nul ensuite
Si vous écriviez
gprs.sendSMS(PHONE_NUMBER, 'envoiTemp');
Vous n’avez pas à en mettre du tout puisque envoiTemp est déjà une String. Si votre fonction attend une cString, vous passez alors envoiTemp.c_str()
J'ai voulu essayer ceci mais j'ai une erreur à la compil
Qu'est-ce qui ne va pas?
char Temp[10];
String TEMP;
String TEMP2;
temperature = 25.4;
dtostrf(temperature, 8, 1, Temp);
TEMP = strcat("Temperature = ", Temp);
TEMP2 = strcat (TEMP, " *c");
Serial.println(TEMP);
Serial.println(TEMP2);
Compilation error sur la ligne TEMP2
: cannot convert 'String' to 'char*' for argument '1' to 'char* strcat(char*, const char*)'
`
Le message est clair. Tu ne peux pas passer une String en argument à strcat() qui travaille sur des c-string.
Pourquoi passer par des String quand tu peux afficher directement des c-string avec println()?
Tu peux très bien faire
Serial.print("Temperature = ");
Serial.print(Temp);
Serial.println(" °c");
Cela ne demande pas de passer par 2 String intermédiaires, ni de faire des concaténations inutiles.
Clair pour toi mais pas pour moi qui suis débutant
Je dois envoyer TEMP2 vers mon gsm au moyen de la fonction gprs.sendSMS(PHONE_NUMBER,TEMP2) mais cela ne marche pas .. erreur de compil suivant
Compilation error: no matching function for call to 'GPRS::sendSMS(const char [13], String&)'
Cela fait un moment que tu hantes ce forum donc tu n'est plus vraiment un débutant.
Le message est clair
ne peut pas convertir 'String' en 'char*' comme argument '1' de 'char* strcat(char*, const char*)'
Et il te donne le prototype de la fonction strcat où tu vois que l'arguments en question est de type char*
Ce n'est pas la première fois que tu as des problèmes de ce genre et cela fait aussi plusieurs fois que je vois @J-M-L te suggérer de te plonger dans les tutos d'Eskimon pour progresser.
À chaque fois aussi il t'est demandé de ne pas publier des morceaux de code car ils sont sortis de leur contexte. Ici typiquement tu posais une question sur strcat alors qu'au final ton problème c'est de construire une String pour l'envoyer à gprs.sendSMS()
Donc, pour répondre à la question que tu n'as pas posée, la classe String supporte la concaténation par l'opérateur + ou par la méthode concat()