Go Down

Topic: probleme code (Read 1 time) previous topic - next topic

djo54150

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

alors je m explique jai deja un bout de programme:

Code: [Select]
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

fdufnews

Quote
Code: [Select]
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.

djo54150

Code: [Select]
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

fdufnews

Tu utilises quel IDE?
Parce qu'il y a cette remarque sur l'aide de la commande Flush()
Quote
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.

djo54150

j utilise la 1.0

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

djo54150

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

fdufnews

Quote
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.

Quote
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.

djo54150

comment je fais pour lire et vider a chaque fois ?

peux tu m'orienter?

skywodd

Salut,


comment je fais pour lire et vider a chaque fois ?

Pour vider le buffer du port série :
Code: [Select]
while(Serial.available()) Serial.read();
(tout simplement)
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

fdufnews

#9
Jun 06, 2012, 10:09 pm Last Edit: Jun 06, 2012, 10:12 pm by fdufnews Reason: 1
Quote
(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.

skywodd


Quote
(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.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

djo54150

jai un probleme avec mon code


Code: [Select]
#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?

Go Up