probleme code

voila vous allez peut etre trouver ca simple mais je bloque un peu

alors je m explique jai deja un bout de programme:

int data;
int puissance;
int led = 13;
int onModulePin = 2;        // the pin to switch on the module (without press on button) 

int x = 0;

void switchModule(){
    digitalWrite(onModulePin,HIGH);
    delay(2000);
    digitalWrite(onModulePin,LOW);
}

void setup(){

    Serial.begin(115200);                // UART baud rate
    delay(2000);
    pinMode(led, OUTPUT);
    pinMode(onModulePin, OUTPUT);
    switchModule();                    // switches the module ON

    for (int i=0;i< 5;i++){
        delay(5000);
    } 
    Serial.println("AT+CPIN=1234");
    delay(8000);
    Serial.println("AT+CGSOCKCONT=1,\"IP\",\"orange.lu\"");
    Serial.flush();
  delay(1000);  
    
}

void loop()
{
Serial.print("AT+SIMEI?");
delay(200);

 data=0;  
  
    data=Serial.read();
  Serial.print(data);
  
  
  Serial.print("AT+CSQ");
delay(200);

puissance=Serial.read();
Serial.print(puissance);

    while(1);
}

mais le probleme cest que j obtiens pas par exemple mon code imei comme souhaité avec la commande at+simei? mais une valeur genre 13 ou 15 (je sais plus ) j'aimerai recopier la chaine de caractere qui apparait comme réponse dans une variable appelé data et la puissance du genre14.65 dans puissance

merci d avance

Serial.print("AT+SIMEI?");

delay(200);

data=0; 
 
    data=Serial.read();
  Serial.print(data);

Je serais surpris que la commande AT+SIMEI? ne retourne qu'un seul caractère étant donné que le code IMEI est composé de 15 caractères.

char puissance[20];
int led = 13;
int onModulePin = 2;        // the pin to switch on the module (without press on button) 

int x = 0;
char data[20];
void switchModule(){
    digitalWrite(onModulePin,HIGH);
    delay(2000);
    digitalWrite(onModulePin,LOW);
}

void setup(){

    Serial.begin(115200);                // UART baud rate
    delay(2000);
    pinMode(led, OUTPUT);
    pinMode(onModulePin, OUTPUT);
    switchModule();                    // switches the module ON

    for (int i=0;i< 5;i++){
        delay(5000);
    } 
    Serial.println("AT+CPIN=1234");
    delay(8000);
    Serial.flush();
    Serial.println("AT+CGSOCKCONT=1,\"IP\",\"orange.lu\"");
    Serial.flush();
  delay(1000);  
    
}


void loop()
{
  Serial.flush();
Serial.println("AT+SIMEI?");

 x=0;  
  do{
        while(Serial.available()==0);
    data[x]=Serial.read();
     x++;
    }while(x < 19);
  Serial.println(data);
  
  
  Serial.println("AT+CSQ");
 x=0;  
  do{
        while(Serial.available()==0);
        puissance[x]=Serial.read();
        x++;
    }while(x < 19);
Serial.println(puissance);

    while(1);
}

la je patauge je test des truc mais sans rien

car la j obtiens la réponse:

AT+CPIN=1234
AT+CGSOCKCONT=1,"IP","orange.lu"
AT+SIMEI?

START

+CPIN: S
AT+CSQ
IM PIN
AT+CPIN=123

cette reponse est la réponse de la commande at+cpin=1234 mais pourtant jai mis un serial.flush() apres pour vidé le buffer ...

je suis un peu perdu

Tu utilises quel IDE?
Parce qu'il y a cette remarque sur l'aide de la commande Flush()

Waits for the transmission of outgoing serial data to complete. (Prior to Arduino 1.0, this instead removed any buffered incoming serial data.)

Il semblerait qu'à partir de la 1.0 flush() se contente d'attendre la fin de l'émission.

Maintenant il me semble (il y a longtemps que je n'ai pas mis le nez dedans) que les commande AT retournent toujours un accusé de réception. Tu devrais peut être récupérer ces accusés de réception pour les visualiser et voir si toutes des commandes passent bien.

j utilise la 1.0

et je comprend pas pour ta question sur les accusés

quand je fais en manuel avec le serial monitor jai les commandes et les réponses je publie pour que vous voyez la forme des réponses

START

+CPIN: SIM PIN
at+cpin=1234

OK

+CPIN: READY

SMS DONE

PB DONE

AT+CGSOCKCONT=1,"IP","orange.lu"

OK
AT+SIMEI?

+SIMEI: 355843030295301

OK
AT+CSQ

+CSQ: 15,99

OK

j utilise la 1.0

Donc déjà flush ne vide pas le tampon de réception.
Il faut donc que tu le vides par toi même en faisant des lectures.

et je comprend pas pour ta question sur les accusés

Ma question c'était juste d'afficher les réponses de ton module GSM pour voir si les commandes AT passaient bien et étaient bien comprises.
Ta recopie d'écran montre que les commandes passent bien donc tu as juste un problème de vidage du tampon de réception.
Il faudrait que tu supprimes les delay() que tu as mis après chaque émission de commande et que tu relises le tampon pour le vider avant de passer à la commande suivante.

comment je fais pour lire et vider a chaque fois ?

peux tu m'orienter?

Salut,

djo54150:
comment je fais pour lire et vider a chaque fois ?

Pour vider le buffer du port série :

while(Serial.available()) Serial.read();

(tout simplement)

(tout simplement)

Oui et non. Parce que rien n'empêche de quitter la boucle si on lit plus vite que les caractères n'arrivent.
Ou alors il faut le faire après une temporisation "raisonnable"
L'idéal étant de savoir combien de caractères on attend. Ce qui est normalement connu.

fdufnews:

(tout simplement)

Oui et non. Parce que rien n'empêche de quitter la boucle si on lit plus vite que les caractères n'arrivent.
Ou alors il faut le faire après une temporisation "raisonnable"
L'idéal étant de savoir combien de caractères on attend. Ce qui est normalement connu.

Si le but est de vider le buffer entrant à un instant t cette simple boucle le fait sans probléme.

Il n'y a même pas de question de temporisation, l'ancienne version de flush() était même encore plus rudimentaire, elle plaçait le curseur du buffer à la fin des données.
Ma boucle fait la même chose mais en moins directe.

jai un probleme avec mon code

#include <SD.h>


char puissance[4];
int led = 13;
int onModulePin = 2;        // the pin to switch on the module (without press on button) 
char imei[16];
int x = 0;

void switchModule(){
    digitalWrite(onModulePin,HIGH);
    delay(2000);
    digitalWrite(onModulePin,LOW);
}

void setup(){

    Serial.begin(115200);                // UART baud rate
    delay(2000);
    pinMode(led, OUTPUT);
    pinMode(onModulePin, OUTPUT);
    switchModule();                    // switches the module ON

    for (int i=0;i< 5;i++){
        delay(5000);
    } 
    Serial.println("AT+CPIN=1234");
    delay(8000);
    
    Serial.println("AT+CGSOCKCONT=1,\"IP\",\"orange.lu\"");
    delay(1000);  
    
}

void loop() {
  
  getImei();
  
  delay(2000);
  
  reseau();
  
  
  
 // sd();
  
  delay(2000);
}
  
void getImei(){
  x=0;
  Serial.flush();
  Serial.println("AT+SIMEI?");
  while(Serial.read()!=':');
  while(Serial.read()!=' ');
  do{
        while(Serial.available()==0);
        imei[x]=Serial.read();
        x++;
  }while(x < 15);
  Serial.println(imei);
  Serial.flush();
 
  
  Serial.print("AT+CHTTPACT=\"twitter.fukuttenom.net"); //Connects with the HTTP server
  Serial.print("\",");
  Serial.println(80);        
    
  delay(5000);
         
  Serial.print("GET /getParam.php?imei=");
  Serial.print(imei);
  Serial.println(" HTTP/1.1");
  Serial.println("Host: twitter.fukuttenom.net"); 
  Serial.println("Content-Length: 0");
  Serial.println();  
  Serial.write(0x1A);       //sends Ctrl+Z
  while(Serial.read()!='K');
  }
  
 void reseau(){
  x=0;
  Serial.flush();
  Serial.println("AT+CSQ");
  while(Serial.read()!=':');
  while(Serial.read()!=' ');
  do{
        while(Serial.available()==0);
       puissance[x]=Serial.read();
       x++;
 }while(x < 5);
 Serial.flush();
 Serial.println(puissance);
 
 }
 
 
 
void sd(){
   if (SD.exists("Data")){
     Serial.println("le dossier data existe deja");
  }
  else {
    SD.mkdir("Data");
    Serial.println("le dossier data a ete cree");
    }
}

la réponse est :

AT+CPIN=1234
AT+CGSOCKCONT=1,"IP","orange.lu"
AT+SIMEI?
355843030295301
AT+CHTTPACT="twitter.fukuttenom.net",80
GET /getParam.php?imei=355843030295301 HTTP/1.1
Host: twitter.fukuttenom.net
Content-Length: 0

AT+CSQ
13,9955843030295301

pourquoi les chiffres imei revienne?