Show Posts
Pages: 1 [2] 3 4 ... 33
16  Using Arduino / Programming Questions / Re: Why the condition is not respected while I have a coma on: September 26, 2014, 02:33:47 pm
Hello
but I post my code!??
I change the way to do. I am using a String
Code:
String sms_pos
to concatenate the desired value
Code:
sms_pos.concat(buffer[x]);
sms_pos.concat(",");
When I wrote comma (or coma), I menas ","  smiley
Here is my code, which is now "loghter"
Code:
Serial1.println(cmd);
  //waitResp(10000,"OK",true); 
 
  char replyCommand [7] = {'+','C','M','G','L',':',' '};
  //char compm [7] = {'0','0','0','0','0','0','0 '};
    int x=0;
    boolean answer=false;
    //char buffer[BUFFERSIZE];
    unsigned long previous;

    memset(buffer, '\0', BUFFERSIZE);    // Initialize the string

    while(Serial1.available() > 0) Serial1.read();    // Clean the input buffer
   
    int y = 0;
    previous = millis();
    int timeout = 5000;
    int count_message = 0;
    String sms_pos;
    int ma = 0;

    // this loop waits for the answer
    do{
        if(Serial1.available() > 0){
          if(x < BUFFERSIZE-1) // Do not fill the buffer more the it size
          {
              buffer[x] = Serial1.read(); // response
              //Serial.print(x); Serial.print(F(":")); Serial.println(buffer[x]);
           
              if(y) // and count_message < 10
              {
/*
                Serial.print(F("("));
                Serial.print(buffer[x]);
                Serial.print(F(")"));
    */           
                if(buffer[x] == ',')
                {
                  Serial.print(F(" | "));
                  sms_pos.concat(",");
                  count_message++;
                  y=0;
                }
                else
                {
                Serial.print(buffer[x]);
                sms_pos.concat(buffer[x]);
                }
              }
           
              //'+','C','M','G','L',':',' '
             
              if (buffer[x] == replyCommand[ma])   
              {
                if(ma==6)
                {
                  y=1;
                   
                }
                else
                {
                  y=0;
                }
                ma++;
         
              }
              else
              {
                ma = 0;
              }
             
           
            x++;
          }
        }
        // Waits for the asnwer with time out
    }
   
    while( ((millis() - previous) < timeout)); 
   
   Serial.print(count_message); Serial.println(F(" messages"));
   Serial.println(sms_pos);
it display this
Quote
2|4|5|67| 4 messages
2,4,5,67,
and it should dipslay
Quote
2|4|5|6|7|8|9|10|11|12|13| 11 message
2,4,5,6,7,8,9,10,11,12,13
When I comment
Code:
sms_pos.concat(buffer[x]);
sms_pos.concat(",");
it return wrongly
Quote
2|45|6|7|4 messages
smiley-sweat
17  Using Arduino / Programming Questions / Re: Why the condition is not respected while I have a coma on: September 26, 2014, 01:56:45 pm
Dear emkojac

Thank for your reply
I do not understand you comment. the test expressionn of the do loop is here
   
Code:
while( ((millis() - previous) < timeout));
the timeout is 5000.

the print of
Code:
buffer[x]
is here, just above the test of the mask //'+','C','M','G','L',':',' '
Code:
Serial.println(buffer[x]);
               
                }
              }
             
             
              //'+','C','M','G','L',':',' '
             
              if (buffer[x] == replyCommand[ma]) 

When I compile it does not display any errors.
 smiley
Did I understood you well?

if I keep it commented
Code:
/*
                  Serial.print(F("----"));
                  for(bbb=0; bbb < message_pos_buff_index; bbb++)
                  {
                    Serial.print(F("pass?"));
                    Serial.print(message_pos_buff[bbb]);
                  }
                  Serial.print(F("---"));
*/
the
Code:
serial.println(buffer[x])
and the print of the pipe works well...
18  Using Arduino / Programming Questions / Why the condition is not respected while I have a coma on: September 26, 2014, 12:52:27 pm
Dear all

I experiencing a funny problem.
I am working with Arduino Leonardo and Arduino 1.5.7

I am listing Serial1.read().
When it read +CMGL (with a space afeter the L), the code read the next position (7th) which mach to a SMS position.
But as a SMS position can have to digit, I have to make the program reading the next position (8th) until it meet the coma.
Here is the an exemple of string to read
Quote
+CMGL: 2,"REC UNREAD","+41763435206","","14/09/25,13:25:42+08"
It work while I print the catched position with Serial print.
In my code there is a condition if
Code:
if(buffer[x] == ',')
if it's true, it add a pipe between the number. And this work.

But now I need to put in buffer, the SMS poisition the use it later in my code.

It very funny, because when I uncomment that part of code
Code:
Serial.print(F("----"));
                  for(bbb=0; bbb < message_pos_buff_index; bbb++)
                  {
                    Serial.print(F("pass?"));
                    Serial.print(message_pos_buff[bbb]);
                  }
                  Serial.print(F("---"));
it does read the coma. so the condition
Code:
if(buffer[x]==',')
return false
when I comment the above code, it return true!!!!!!

Could you explain me that????

Here is my code
Code:
Serial.println(AT+CMGL=\"REC UNREAD\",1);
char replyCommand [7] = {'+','C','M','G','L',':',' '};
  //char compm [7] = {'0','0','0','0','0','0','0 '};
  uint8_t x=0;
    boolean answer=false;
    //char buffer[BUFFERSIZE];
    unsigned long previous;

    memset(buffer, '\0', BUFFERSIZE);    // Initialize the string

    while(Serial1.available() > 0) Serial1.read();    // Clean the input buffer
   
    int y = 0;
    previous = millis();
    int timeout = 5000;
    int count_message = 0;
    char message_pos[10];
    char message_pos_buff[4];
    int message_pos_buff_index = 0;
    int bbb;
    int ma = 0;

    // this loop waits for the answer
    do{
        if(Serial1.available() > 0){
          if(x < BUFFERSIZE-1) // Do not fill the buffer more the it size
          {
            // READ THE RESPONSE, CARACTER BY CARACTER
              buffer[x] = Serial1.read();
              //delay(500);
// DISPLAY THE CARACTER BY POSITION
              Serial.print(x); Serial.print(F(":")); Serial.println(buffer[x]);
           
// IF THERE WERE 6 FOLLOWING CARACTER MATCHING THE MASK, CONTINUE
              if(y)
              {
// IF CARACTER MATCH TO COMA
// IF THE NUMBER is 10, IT WILL GO TO else AND WHEN IT MEET A COMA IT CONTINUE HERE
                if(buffer[x] == ',')
                {
// DEBUG                 
                  Serial.print(F(".("));
                  Serial.print(message_pos_buff_index);
                  Serial.println(F(")."));
                  // HERE I WANT TO READ MY SMS POSITION. IF THE POSITION IS 2, IT SHOULD GO ONCE IN THE FOR LOOP. IF ITS 10 IT SHOULD GO TWICE. BUT WHEN I UNCOMMENT IT, if(buffer[x]==',') return false, when it should return true. WHY?
                  /*
                  Serial.print(F("----"));
                  for(bbb=0; bbb < message_pos_buff_index; bbb++)
                  {
                    Serial.print(F("pass?"));
                    Serial.print(message_pos_buff[bbb]);
                  }
                  Serial.print(F("---"));
*/
                 
                 
                  message_pos_buff_index=0;
                  Serial.print(F("..("));
                  Serial.print(message_pos_buff_index);
                  Serial.println(F(").."));
                 
                  Serial.println(F(" | "));
                 
                  count_message++;
                  y=0;
                 
     
                 
                 
                }
                else
                {
                  // IF CARACTER DOES NOT MATCH, PRINT THE 7th CARACTER
Serial.println(buffer[x]);
                // DEBUG
                Serial.print(F("message_pos_buf_index "));Serial.println(message_pos_buff_index);
                // PUT CARACTER INTO A BUFFER
                 message_pos_buff[message_pos_buff_index] = buffer[x];
// INCREMENT THE BUFFER INDER FOR THE NEXT CARACTER, IF THE POSITION IS ABOVE 9
                 message_pos_buff_index++;
     // DEBUG
                 Serial.print(F("("));
                 Serial.print(message_pos_buff_index);
                 Serial.println(F(")"));
                 
                 
               
                }
              }
             
             
              //'+','C','M','G','L',':',' '
              // COMPARE THE CARACTER
              if (buffer[x] == replyCommand[ma])   
              {
// IF THERE 6 SAME CARATER AS THE MASK PUT Y TO 1 (SEE UP IN THE CODE )
                if(ma==6)
                {
                  y=1;
                   
                }
                else
                {
                  y=0;
                }
// IF IT MATCH INCREMENT TO CONTROLL IF THERE 6 CARACETERS WHICH ARE FOLLOWING
                ma++;
         
              }
              else
              {
// IF THE 2nd OR ONE BETWEEN THE 6 REQUIRED CARACTER, PUT ma TO 0
                ma = 0;
              }
             
           
            x++;
          }
        }
        // Waits for the asnwer with time out
    }
   
    while( ((millis() - previous) < timeout)); 
   
   Serial.print(count_message); Serial.println(F(" messages"));
   /*
   for(int s=0; s<=count_message;s++)
   {
     Serial.println(message_pos[s]);
   }
   */
 
}


Any idea, or how can make it better?
What's bug with
Code:
if(buffer[x]==',')
19  International / Français / Re: Comment puis-je mettre en buffer un loop qui affiche un caracter on: September 26, 2014, 11:08:53 am
Voici le code complet
Code:
int y = 0;
    previous = millis();
    int timeout = 5000;
    int count_message = 0;
    char message_pos[10];
    char message_pos_buff[4];
    int message_pos_buff_index = 0;
    int ma = 0;

    // this loop waits for the answer
    do{
        if(Serial1.available() > 0){
          if(x < BUFFERSIZE-1) // Do not fill the buffer more the it size
          {
              buffer[x] = Serial1.read(); // response
              //delay(500);
              //Serial.print(x); Serial.print(F(":")); Serial.println(buffer[x]);
           
              if(y) // and count_message < 10
              {
                Serial.print(buffer[x]);
                if(buffer[x] == ',')
                {
                  /*
                  Serial.print(F(".("));
                  Serial.print(message_pos_buff_index);
                  Serial.print(F(")."));
                 
                 
                  Serial.print(F("***"));
                  for(int bbb=0; bbb < message_pos_buff_index; bbb++)
                  {
                    Serial.print(message_pos_buff[bbb]);
                  }
                  Serial.print(F("***"));
                  */
                 
                  message_pos_buff_index=0;
                  Serial.print(F(" | "));
                 
                  count_message++;
                  y=0;
                 
     
                 
                 
                }
                else
                {
                 
                // Serial.print(buffer[x]);
                /*
                 message_pos_buff[message_pos_buff_index] = buffer[x];
                 message_pos_buff_index++;
                 //Serial.print(F("-"));
                 //Serial.print(message_pos_buff[message_pos_buff_index++]);
                 
                 Serial.print(F("("));
                 Serial.print(message_pos_buff_index);
                 Serial.print(F(")"));
                  */
                }
              }
             
             
              //'+','C','M','G','L',':',' '
             
              if (buffer[x] == replyCommand[ma])   
              {
                //Serial.println(replyCommand[ma]);
                //Serial.print(F("EGAL : "));Serial.println(buffer[x]);
               
                if(ma==6)
                {
                  y=1;
                   
                }
                else
                {
                  y=0;
                }
                ma++;
         
              }
              else
              {
                ma = 0;
              }
             
           
            x++;
          }
        }
        // Waits for the asnwer with time out
    }
   
    while( ((millis() - previous) < timeout)); 
   
   Serial.print(count_message); Serial.println(F(" messages"));
20  International / Français / Comment puis-je mettre en buffer un loop qui affiche un caracter on: September 26, 2014, 11:02:39 am
Bonjour à tous,
Je deviens fouououuuu.
Et j'ai peur de ne pas pouvoir être prècis, mais je vais essayé.
J'ai un code qui m'affiche ceci:
Quote
2|4|5|6|7|8|9|10|11|12|13|
Ca affiche correctment ce que je peux. J'ai mis un pipe pour distinguer les chiffres.
Simplement, je ne fais que d'afficher un chiffre et j'aimerais le mettre dans un buffer/array pour l'exploiter plus tard.
Donc j'aimerais avoir
Code:
char message_pos_buff;
message_pos_buff[0]=2
message_pos_buff[1]=4
message_pos_buff[2]=5
message_pos_buff[3]=6
message_pos_buff[4]=7
message_pos_buff[5]=8
message_pos_buff[6]=9
message_pos_buff[7]=10
message_pos_buff[8]=11
message_pos_buff[9]=12
message_pos_buff[10]=13
Et je n'y arrive pas, évidemment

Mon code est le suivant
Code:
do{
        if(Serial1.available() > 0){
          if(x < BUFFERSIZE-1) // Do not fill the buffer more the it size
          {
              buffer[x] = Serial1.read(); // response
              //delay(500);
              //Serial.print(x); Serial.print(F(":")); Serial.println(buffer[x]);
           
if(y)
              {
                /*
QUAND IL NE RENCONRE PAS DE VIRGULE, IL VA COMMENCER A AFFICHER 2.
 APRWS 2 IL Y A UNE VIRGULE, DONC IL VA AFFICHER LE PIPE. CA C'EST BON!
J AIMERAIS QU'IL N'AFFICHE PAS LE 2 MAIS QU'IL LE METTRE DANS UN BUFFER.
ET AU LIEUX D'AFFICHER LE PIPE, IL INCREMENT LE BUFFER.
DONC APRES IL MET EN BUFFER LE 4 ET VU QU'APRES LE 4 IL Y A UNE VIRGULE, IL INCREMENT LE BUFFER.
IDEM POUR LE 10.
APRES LE 1 du 10, IL Y A PAS DE VIRGULE, DONC IL n'INCREMENTE PAS LE BUFFER. APRES, ARRIVE LE 0. IL FAUT QU'IL AJOUTE 0 A 1, POUR AVOIR 10. APRES LE ZERO, IL  Y A UNE VIRGULE. DONC AU LIEUX D'AFFICHER LE PIPE, IL INCREMENT LE BUFFER

J AI ESSAYER DE METTRE DANS UN SUBBUFFER (message_pos_buff),LE 2, CONVERTIR EN IT POUR LE METTRE DANS LE BUFFER.
IDEM POUR LE 4,5,6 ETC.
POUR LE 10, J AI ESSAYE DE METTRE LE 1 ET LE 0 DANS UN SUBBUFFER, POUR CONVERTIR LA VALEUR DU SUBBUFFER EN INT ET DE METTRE 10 DANS LE BUFFER.
NEANT, PAS REUSSI. POURVEZ-VOUS MA'IDER?
*/
                if(buffer[x] == ',')
                {
                  /*
                  Serial.print(F(".("));
                  Serial.print(message_pos_buff_index);
                  Serial.print(F(")."));
                 
                 
                  Serial.print(F("***"));
                  for(int bbb=0; bbb < message_pos_buff_index; bbb++)
                  {
                    Serial.print(message_pos_buff[bbb]);
                  }
                  Serial.print(F("***"));
                  */
                 
                  message_pos_buff_index=0;
                  Serial.print(F("|"));
                 
                  count_message++;
                  y=0;
                 
     
                 
                 
                }
                else
                {
                 
                Serial.print(buffer[x]);
                /*
                 message_pos_buff[message_pos_buff_index] = buffer[x];
                 message_pos_buff_index++;
                 //Serial.print(F("-"));
                 //Serial.print(message_pos_buff[message_pos_buff_index++]);
                 
                 Serial.print(F("("));
                 Serial.print(message_pos_buff_index);
                 Serial.print(F(")"));
                  */
                }
              }


...suite du code et fermeture de do....

J'espère que vous allez comprendre mon explication et mon code. J'ai ajouté un commentaire en majuscule dans le code.

Milles merci
21  International / Français / Re: Comment extraire qu'une partie d'une chaine de caractere a partir d'une position on: September 26, 2014, 03:12:46 am
Bon, un peu plus simple que je l'avais pensé. J'ai modifié ma fonction ainsi et ca semble bien fonctionner
Code:
if(y)
              {
               
               
                if(buffer[x] == ',')
                {
                  //message_pos[count_message] = buffer[x];
                count_message++;
                  y=0;
                  Serial.println(F(""));
                }
                else
                {
                  //Serial.print(F("(")); Serial.print(buffer[x]); Serial.println(F(")"));
                Serial.print(buffer[x]);
                }
               
              }
22  International / Français / [Resolu]Comment extraire qu'une partie d'une chaine de caractere a partir d'une on: September 26, 2014, 02:31:34 am
Bonjour à tous,
Je travaille sur les SMSs
J'utilise une fonction AT qui va lister les messages reçus. La commande est
Code:
AT+CMGL=\"REC UNREAD\",1
Ca marche et ca m'affiche ceci, par exemple:
Quote
+CMGL: 2,"REC UNREAD","+41760000000","","14/09/25,13:25:42+08"
Salut, voici un sms
+CMGL: 3,"REC UNREAD","+41760000000","","14/09/25,13:25:42+08"
Salut, voici un autre sms
+CMGL: 6"REC UNREAD","+41760000000","","14/09/25,13:25:42+08"
Salut, voici  encore un autre sms
Après +CMGL: il y a un2, un 3 et un 6. Ce chiffre correspond a la position du message.
Donc quand je veux lire le message, je dois indiquer la position du message avec la commande
Code:
AT+CMGR=6,1 // 6 est la position du sms a lire
Je dois donc extraire ce nombre. J'ai réussi a le faire mais j'ai un problème quand le nombre a deux décimals.

Pourcela j'ai fait ce code: (J'espère qu'il vous semblera bien fait  smiley
Code:
   char replyCommand [7] = {'+','C','M','G','L',':',' '};
    //char compm [7] = {'0','0','0','0','0','0','0 '};
    uint8_t x=0;  
    int y;
    int count_message = 0;
    char message_pos[10];
    int ma=0;

    // this loop waits for the answer
    do{
        if(Serial1.available() > 0){
          if(x < BUFFERSIZE-1) // Do not fill the buffer more the it size
          {
            buffer[x] = Serial1.read(); // response
        
            // Si le flag y est a 1, alors affiche le caractere suivant, soit le 7 eme et met le dans un buffer
              if(y)  
              {
                // ICI J AFFICHE LE CHIFFRE . Dans cet exemple, il affichera 2,3,6
                Serial.println(buffer[x]);
              
                 // met dans le buffer
                //message_pos[count_message] = buffer[x];
              
              // Compte le nombre d emessage recu
               count_message++;
               // remte le flag a 0
                y=0;
              }

              // Compare le caractere, si oui continue
              if (buffer[x] == replyCommand[ma])    
              {

                // Si les 6 premieres caracteres correspondent met le flag y à 1
                if(ma==6)
                {
                  y=1;
                }
                else
                {
                  y=0;
                }
                // Afin de s'assurer que la correspondance des caracteres comparés se suivrent incrémente de 1 et
                // remets à zero imediatement si le caratere suivant ne correspond pas
                ma++;
              }
              else
              {
                ma = 0;
              }
            x++;
          }
        }
    }
    
    while( ((millis() - previous) < timeout));  
  
   Serial.print(count_message); Serial.println(F(" messages"));
Le problème dans se code, c'est qu'il va que relevé le numero se trouvant à la septième position. Donc tant que les messages se trouveront entre la position 1 à 9, ca marchera, mais aussi tôt qu'il se trouvera à la position 10, je recupérerai le 1 de 10!!! Donc bug!

Vous constarerez que la position d'un message est toujours suivit par une virgule.

Ma question est la suivante.
Comment pourrais-je récupérer tous les chiffres depuis la position 7.
Voir mon code ou le flag y est mis a 1
Code:
   if(ma==6)
....
jusqu'à la virgule sans prendre la virgule????

Ainsi je ne serai pas souci si mon nombre est 11 ou 110....

Milles mercis pour vos lumières
23  International / Français / Re: Comment convertir un char en un ...... char!!!! on: September 22, 2014, 10:05:23 am
Hello,
je suis à 9600
24  International / Français / Es-ce que le boolean est fiable on: September 21, 2014, 05:52:30 pm
Bonjour,
J'ai vraiment une question bête et idiote, mais je arrivé à me poser cette question

Avant le setup() j'ai déclarer cette variable
Code:
boolean firstCoords = false;
Elle me sert a envoyer un SMS des la premiere position GPS est recu, uniuqmenet.

Dans mon loop(), j'ai ceci
Code:
void loop()
{
  if(readyToGo)
  {
    // Toutes les 20sec, regarde s'il recoit du GPS
    // SCHEDULER TO GET GPS COORDINATE at an interval of INTERVAL_GPS
    if (millis() > scheduler_gps)
    {
      scheduler_gps = millis() + INTERVAL_GPS;
     
        // Si les stat du GPS est supérieur à 1 (2 Fix ou 3 Fix
        if(gps_stat() > 1)
        {
          // Prends les posisitions et envoi les au serveur distant
          if(gps_read())
          {
              #ifdef DEBUG
                Serial.print(F("  Lat : ")); Serial.println(lat);
                Serial.print(F("  Lon : ")); Serial.println(lon);
                Serial.print(F("  Alt : ")); Serial.println(alt);
                Serial.print(F("  Date : ")); Serial.println(dat);
                Serial.print(F("  Sat : ")); Serial.println(sat);
                Serial.print(F("\n"));
              #endif
            // Si c'est la premiere fois, envoi un SMS
            if(firstCoords == false)
            {
              sprintf(sms_text,"First coords received, Lat: %s, Lon: %s, Alt. %s, Tim: %s",lat,lon,alt,dat); 
             // Envoi SMS avec les coords
              if(sms_send(owner,sms_text))
              {
                // Si envoyé met à true
                firstCoords = true;
                #ifdef DEBUG
                  Serial.println(F("> SMS sent"));
                #endif
              }
              else
              {
                #ifdef DEBUG
                  Serial.println(F("> SMS not sent"));
                #endif
              }
            }
            // SEND DATAS
            send_HTTP();
          }  // end gps_read
        } // end if gps_stat
    } // End timer
  }
 
  #ifdef DEBUG
    serialhwread();
  #endif
}

Le truc de fou c'est qu'il m'envoi deux fois un SMS.
Puis j'ai lancé une seconde fois en regardant mes debug sur le terminal avec un
Code:
Serial.println(firstCoords)
placé en dessous de mes 4 autres Serial.println(lat),

et... je vois que le firstCoords affiche,
une fois 0
une fois 1
puis 0
puis une chiffre supéreur à 1 !!!!!!!!

Supérieur à 1????? Mais es-ce possible pour un boolean???

Je me suis donc demandé si je devrais pas déclaré firstCoords, en int.
Comme ceci, je controlle juste si firstCoords est inf à 1
Code:
if(firstCoords < 1)

En regardant ma loop(), comment firstCoords peut revenir à false, puisqu'é aucun moment il est mis à false?????
D'ou ma question bête..
Bonne nuit
25  International / Français / Re: Comment convertir un char en un ...... char!!!! on: September 21, 2014, 05:41:18 pm
J'ai constaté que meme si je perds la connection USB, le Arduino continue a tourner.
C'est un peu embetant et je me demande si la perde de connection est de "ma faute".
Quoi qu'il en soit je vais faire avec et je vais diminuer mes Serial.print() ainsi que le texte de debugage a afficher.
Merci
26  International / Français / Re: Comment convertir un char en un ...... char!!!! on: September 21, 2014, 10:42:50 am
OK, j'ai une dernier question.
he remarque que mon programme plante souvent au moment d'un Serial.print
Typiquement, il a planté en affichant ceci
Code:
Serial.println(F(">  Number must be havee 12 digits, including the + for country code."));
!

Même si j'ai mis en F, es-ce qu'on est limiter dans la longeur du text a afficher?
et es-ce qu'on est limiter dans le nombre de Serial.println?

En effet, j'en utilise beaucoup!!
27  International / Français / Re: Comment convertir un char en un ...... char!!!! on: September 21, 2014, 09:45:32 am
Je crois que j'ai trouvé ou est mon problème.
Quand he récupère un ligne de caractere qui est entré dans mon terminal, Donc en Serial, et qui sera sauver dans un char, il doit ajouter un \0.

Je ne suis as encore convaincu, mais pour le moment ca marche.

J'ai fais le teste ici
//Si je tape, dans mon terminal, d,w,+41761112233, pour sauver le numero dans la peremiere position libre de ma carte SIM
if(!
Code:
strncmp(splitedString[1],"w",1))
        {
// Je vrée un char dont sa taille prendra le nombre de caractere de +41761112233 + 1
          char phone[strlen(splitedString[2])+1];
// sprintj ajoute \0 à la fin de la chain. donc il prend la chaine et le met dasn phone ET AJOUTE \0
          sprintf(phone,"%s",splitedString[2]);
          Serial.print(F("Phone : "));Serial.println(phone);
         // Je passe le numero dans ma fonction
         dir_write(phone);
}
ET CA MARCHE!!! Le programme ne plante plus. Après avoir passer la journée, j'étais convaincu que le problème venais d'un char.

Mais je vais encore fait des testes.

@_pepe
J'aimerais juste reboudir sur ceci
Quote
Je corrige ce que j'ai indiqué plus haut.
Le compilateur C++ est parfaitement capable de calculer la taille de la variable locale allouée sur la pile.

On est alors d'accord, que ceci est correct alors?
Code:
char phone[strlen(splitedString[2])+1];
28  International / Français / Re: Comment convertir un char en un ...... char!!!! on: September 21, 2014, 05:41:52 am
Oui voilà.
J'avais deja regardé ceci, et il m'affichait un truc de correct. J'ai refais le teste et voici exactement, dans l'état actuelle, ce qu'il m'affiche, selon le code que je remets, ci-dessous, pour rapelle.

Il m'affiche ceci:
Code:
AT+CPBW=,"+22334445566",145,""
Sachant que j'ai taper dans mon terminal (Serial)
Quote
dir,w,+41223344445566

Donc pour rapelle, la commande
Code:
void dir_write(char *phone_number)
{
     char cmd[33];
     snprintf(cmd,33,"AT+CPBW=,\"%s\",145,\"\"",phone_number);
     Serial.println(cmd);
    if(sendATcommand(cmd,"OK",2000,false,false,true)) // CA NE MARCHE PAS ET JE PERD MA CONNECTION USB A SE MOMENT LA
   // if(sendATcommand("AT+CPBW=,\"+41761112233\",145,\"\"","OK",2000,true,false,true)) // CA MARCHE
    {
      #ifdef DEBUG
      Serial.println(F("  Saved"));
      #endif
    }else{
      #ifdef DEBUG
      Serial.println(F("  Not saved"));
      #endif
    }
}
Il faut savoir que phone_number est déclarer avant le setup(), donc en dehor d'une command
Code:
char phone_number[15] // +33133445566 (12+1) +41762223344(12+1) (J'ai mis 15 au lieux de 13, pour assurer)

Pour rapelle encore, je lance ma commande comme ceci
Code:
loop()
{
#ifdef DEBUG
// J'écoute ce qui est tapper dans le terminal Serial.read
serialhwread()
#endif
}
#ifdef DEBUG
void serialhwread(void)
{
  int i=0;
  char inSerial[5]; //inSerial[20]
  boolean error = false;
 
  if (Serial.available() > 0){   
     
      while (Serial.available() > 0) {
        inSerial[i]=(Serial.read());
        delay(10);
        i++;     
       }
   
    inSerial[i]='\0';
   
      /* Write to dir */
// Si les 3 premiers caracteres sont 'dir'
      if(!strncmp(inSerial,"dir",3))
      {
// Je mets dans un array la ligne entrée. le delimiteur est une virgule
// La commande teste est dir,w,+41761112233, pour ecrire (w) +41761112233 dans le phonebook
        splitString(inSerial,splitedString);
//splitedString me retourne
//0.dir
//1.w
//2.+41761112233
        // Si la commande est w
        if(!strncmp(splitedString[1],"w",1))
        {
        // alors appelle la fonction et passe comme paramettre le numéro de téléphone
         
dir_write(splitedString[2]);

        }



// VOILA.
// LES RESTE FONCTION. C'EST BON, C'EST dir_write qu coince
        else if(!strncmp(splitedString[1],"d",1))
        {
          #ifdef DEBUG
            Serial.println(F("> Delete a position from dir"));
          #endif
          if(strlen(splitedString[2]) < 1)
          {
            #ifdef DEBUG
              Serial.println(F("  Could not delete"));
            #endif
          }
          else
          {
            dir_del(atoi(splitedString[2]));
          }
        }
        else if(!strncmp(splitedString[1],"r",1))
        {
          #ifdef DEBUG
            Serial.println(F("> Read dir"));
          #endif
        }
        else if(!strncmp(splitedString[1],"l",1))
        {
          dir_list(10);
        }
        else
        {
          Serial.println(F("Erreur"));
        }
       
      }
   
    // Vide inSerial
    inSerial[0]='\0';
  }
}
#endif
29  International / Français / Re: Comment convertir un char en un ...... char!!!! on: September 21, 2014, 04:45:48 am
Hello,
Alors ca c'est un point très intéressant et peut être que j'ai choisi une mausvaise manière de faire.

En effet, j'ai plusieurs fonction qui lance une commande comme exemple
Code:
boolean sms_read(int sms_pos,char *sms_from_number, char *sms_date, char *sms_time, char *sms_text)
boolean sms_send(int pos, char *sms_text)
void dir_write(char *phone_number)
void dir_read(int pos)

Toutes ces fonctions vont utiliser une commande AT+ dans lesquelles je dois include un parametre.

Donc dans toutes ces fonctions, et uniquement DANS la fonction je déclare la même varaiable

Code:
char cmd[12]
Mais j'amais je la déclare en dehor d'une fonction. A mon sens, ca doit fonctionner puisqu'un varibale qui est déclarer dans une fonction est détruite quand on quitte la fonction. Mas, en efet, il convient de se poser la question, si cette méthode de faire est cotrrect!!

L'autre truc, l'exemple la variable phone_number, est bonne. Je dois ternir compte qu'un numero suis n'a pas la même longeur qu'un numéro français ou d'un autre pays. Donc je pensais bien faire en calculant la nombre de caractere de la variable passer en paramètre, d'y ajouter les caractères de la commande utilisé, en y ajouter deux-trois place en plus, au cas ou, ceci pour éviter que la variable cmd soit surchargée.

C'est pourcela que j'ai fait comme ceci.
Code:
char cmd[strlen(phone_number)+21];
 //Serial.print("cmd:");Serial.println(sizeof(cmd));
 snprintf(cmd,sizeof(cmd),"AT+CPBW=,\"%s\",145,\"\"",phone_number);

Maintenant, ta remarque m'interpelle et je me pose la question si je fais bien de déclarer la même variable dans divers fonction?
Je pense , en effet, que ceci dois bien être fait avant de comprendre pourquoi ca
Code:
sendATcommand("AT+CPBW=,\"+41763334455\",145,\"\"","OK",2000,true,false,true)
ca passe.
Et ca
Code:
char cmd[strlen(phone_number)+21];
 //Serial.print("cmd:");Serial.println(sizeof(cmd));
 snprintf(cmd,sizeof(cmd),"AT+CPBW=,\"%s\",145,\"\"",phone_number);
sendATcommand(cmd,"OK",2000,true,false,true)
ca passe pas.

A savoir que le premier paramètre demander dans sendATcommand est un char

Code:
uint8_t sendATcommand(char* ATcommand, char* expected_answer1, unsigned int timeout, boolean ln, boolean getResponse, boolean debug_buff)
{
30  International / Français / Comment convertir un char en un ...... char!!!! on: September 20, 2014, 06:09:52 pm
Hello,

Je me prends le chou mais trop méchament.
C'ette commande fonctionne

Code:
sendATcommand("AT+CPBW=,\"+41763334455\",145,\"\"","OK",2000,true,false,true)
Il m'enregistre bien le numéro.

Le truc c'est que le numero n'est pas fix. Voici la fonction.
Je dois récupéerer 'phone_number et l'intégrer dans la commande AT.
Code:
void dir_write(char *phone_number)

   // je calcul la longuer du numéro et j'aoute la longuer de la commande
     char cmd[strlen(phone_number)+21];
     // Je fusionne dans cmd, le tout
     snprintf(cmd,sizeof(cmd),"AT+CPBW=,\"%s\",145,\"\"",phone_number);
   // et là ca bloque
    if(sendATcommand(cmd,"OK",2000,true,false,true))
    {
      #ifdef DEBUG
      Serial.println(F("  Saved"));
      #endif
    }else{
      #ifdef DEBUG
      Serial.println(F("  Not saved"));
      #endif
    }
}

Pourquoi ca fonctionne comme ceci:
Code:
sendATcommand("AT+CPBW=,\"+41763334455\",145,\"\"","OK",2000,true,false,true)
et pas qaudn j'utilise la fonction snprintf()

C'est un truc de fou!!!! et j'en suis sure que vous aller régler ceci en un tour de main!!!!
Pages: 1 [2] 3 4 ... 33