Show Posts
Pages: 1 2 [3] 4 5 ... 33
31  International / Français / [Resolu]Re: Quel est la différence entre memset et \0 on: September 20, 2014, 01:09:27 pm
Merci _pepe_
ca confirme ce que je pensais
32  International / Français / Quel est la différence entre memset et \0 on: September 20, 2014, 11:18:15 am
Bonjour,

Je vines de lire ceci
http://www.cplusplus.com/reference/cstring/memset/

en gros si mon char
Code:
char buffer[250];
a des valeurs
et je fais
Code:
memset(buffer,'\0',250)
toutes les caractere seront remplacer par \0.

Mais si je fais ceci
Code:
buffer[0]='\0';
C'est la même chose, puisque '\0' est le dernier élément de ma cahine. non?
33  International / Français / Mon Leonardo perd la connection USB on: September 20, 2014, 10:27:28 am
Bonjour à tous,
Je travaille sous Mac et j'ai un Arduino Leonardo.
J'avance dans mon priojet et je tarvaille sur un fonction qui va enregistrer les téléphone dans la carte SIM et une fois fais, il liste les 10 premiere positions. Ce qui me permets de voir si l'enregistrement est bien fait.

Aussi, temporairement, quand j'allume le Leonardo, des que le module est prêt, il liste le phonebook de la carte SIM.

Ensuite, dans mon terminal, si je tape dir,w,2,+41761239955, mon programme va comprendre que c'est un commande liée au director, qu'il doit enregistrer, à la position 2, le numero +41761239955.

Généralement, quand la fonction dir_list(), qui liste les numeéro enregistré, après qu'il ait affiché l'avant dernier position, je pers la connection USB!! et ceci, après avoir enregistrer un numéro.
Mais pourquoi?

Code:
void loop()
{
  #ifdef DEBUG
    serialhwread();
  #endif
}
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';

      /* Atcion phonebook */
      if(!strncmp(inSerial,"dir",3))
      {
        if(!strncmp(splitedString[1],"w",1))
        {
          if(strlen(splitedString[3]) < 12)
          {
            #ifdef DEBUG
              Serial.println(F("> Write to dir => KO"));
              Serial.println(F("  Phone number must have 12 digits including the + for the country code."));
            #endif
          }
          else
          {
            if(strlen(splitedString[2]) < 1)
            {
              #ifdef DEBUG
                Serial.println(F("> Write to dir at the next available position"));
              #endif
              dir_write(splitedString[3]);
            }
            else
            {
              #ifdef DEBUG
                Serial.print(F("> Write to dir at the position "));
                Serial.println(atoi(splitedString[2]));
              #endif
              dir_write_to_pos(atoi(splitedString[2]),splitedString[3]);
            };
          }
         
        }

          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
Voici les function qui écrive dans le Phone Book
Code:
void dir_write(char *phone_number)
{
    char cmd[27];
    sprintf(cmd,"AT+CPBW=,\"%s\"",phone_number);
    sendATcommand(cmd,"OK",2000,true,false,false); // Put 5ft parameter to true, to have the response in buffer.
    delay(500);
    #ifdef DEBUG
      dir_list(10);
    #endif 
}

void dir_write_to_pos(int pos, char *phone_number)
{
    char cmd[28]; //AT+CPWBW=1,"+41761235689"
    sprintf(cmd,"AT+CPBW=%d,\"%s\"",pos,phone_number);
    sendATcommand(cmd,"OK",2000,true,false,false); // Put 5ft parameter to true, to have the response in buffer.
    delay(500);
    #ifdef DEBUG
      dir_list(10);
    #endif 
}
Et celle qui liste
Code:
void dir_read(int pos)
{
    char cmd[12];
    sprintf(cmd,"AT+CPBR=%d",pos);
    sendATcommand(cmd,"OK",2000,true,false,false); // Put 5ft parameter to true, to have the response in buffer.
    splitString(supprimeCaractere(buffer_by_line[2],'"'),splitedString);
    strcpy(phone_number,splitedString[1]);
   
    #ifdef DEBUG
      Serial.print(pos);Serial.print(F(":"));Serial.println(phone_number);
    #endif
   
}
void dir_list(int nb)
{
  for(int dl=1; dl<= nb; dl++)
  {
    dir_read(dl);
  }
}
Bon ca fait beaucoup de lecture.
 smiley

Je me demande si ce n'est à cause des déclarations de variable
Code:
char cmd[15];
Pourtant j'ai fait attention que la variable soit assez grande pour recevoir les catacteres
voir dir_write_to_pos();

Je me demand s'il est impératif de mettre '\0' pour "fermer" le char, étant donner que le char lui reste de la place.
Code:
void dir_write_to_pos(int pos, char *phone_number)
{
    char cmd[28]; //AT+CPWBW=1,"+41761235689"
    sprintf(cmd,"AT+CPBW=%d,\"%s\"\0",pos,phone_number); // ICI!!!!
    sendATcommand(cmd,"OK",2000,true,false,false); // Put 5ft parameter to true, to have the response in buffer.
    delay(500);
    #ifdef DEBUG
      dir_list(10);
    #endif 
}

Bref, je en sais pas si je perd ma connection USB, si c'est à cause de code ou si c'est un problème de Hardware???

Milles mercis pour votre lecture. Et s'il vous faut plus d'explication, dites le moi smiley-mr-green
34  Using Arduino / Programming Questions / Re: How do I convert a String to a char on: September 19, 2014, 02:20:21 pm
Hello
But I tried several option
Code:
char *c = splitedString[1];
  strcpy(sms_from_number,c);
that generate this
Code:
sim908_cooking:841: error: invalid conversion from 'char' to 'char*'

Code:
  sprintf(sms_from_number,"%s,splitedString[1])
generate
Code:
sim908_cooking:840: error: invalid conversion from 'int' to 'const char*'
smiley-roll-sweat smiley-roll-sweat sorry
35  Using Arduino / Programming Questions / How do I convert a String to a char on: September 19, 2014, 02:06:44 pm
Hello,
I frustred to be blocked with that.
I can nit copy a string to a char

I declare spliedString like this

 
Code:
   // SlitString
    #define NBVALS 9
    char *splitedString[NBVALS];

I have that function
Code:
splitString("toto,+345,titi",slitedString)
Code:
    void splitString(char *ligne, char **splitedString)
    {
     
      char *p = ligne;
     
      int i = 0;
      splitedString[i++] = p;
      while (*p) {
       
       
        if (*p==',') {
          *p++ = '\0';
          if (i<NBVALS){
             splitedString[i++] = p;
          }
        }
        else
        {
          p++;
        }
     
      }
      while(i<NBVALS){
        splitedString[i++] = p;
      }
    }
If I do a for with splitedString display, it display this

Code:
    for(int i=0;i<4;i++){
    Serialprint(i);Serial.print(":");Serial.println(splitedString[i]);
    }

    //0:toto
    //1:+4176112233
    //2:14/09/19

I also declared and want to copy..

 
Code:
  char sms_who[15];
    char sms_phone_number[15];
    char sms_data[15];
    //and I want to copy
    strcpy(sms_who,splitedString[0])
    strcpy(sms_phone_number,splitedString[1])
    strcpy(sms_date,splitedString[2]
)

This generate an error message
Code:
strcpy(sms_who,splitedString[0])
Quote
sim908_cooking:840: error: invalid conversion from 'char' to 'char*'
while splitedString[0] contain 'toto' and tot is a string in a char?
I know, I am very confused with char and pointer * :o(
36  International / Français / Re: Problème de conversion sur un char on: September 19, 2014, 12:56:49 pm
Super, ca marche !!!!!!!!!
Merci beaucoup _pepe_, t'es génial et merci pour ta grande patience smiley
Code:
char * supprimeCaractere(char *chaine, char caractere)
{
  char *p, *q;

  p = chaine;
  while (*p != caractere) {
    if (! *p)
      return false;
    p++;
  }
  q = p;
  do {
    p++;
    while (*p == caractere)
      p++;
    *q++ = *p;
  } while (*p);
 
  Serial.print("Supp caracter : ");Serial.println(chaine);
return chaine;

Ceci dit je ne comprens pas comment 'chaine' est modifié.
chaine est utilisé que dans la troisème ligne lorsqu'il donne sa valur à p? comment 'chaine' peut prendre une valeur s'il n'y a pas un truc du genre chaine=p??..
J'ai aussi un peu changer la fonction pour qu'il retourne la valeur
37  International / Français / Re: Problème de conversion sur un char on: September 19, 2014, 11:54:19 am
Salut _pepe_
 smiley-red smiley-red
Ca marche toujours pouasss. Cette fois ca affiche rien.
A part ca, je te remercie sincerement pour ta patience. C'est cool d'avoir des gras comme ca sur le forum. Ce qui me frustre, c'est de solicité sur un truc simple  smiley-small smiley-small

Bref...

Code:
Serial.println(buffer_by_line[2]); // Affiche +CMGR: "REC READ","33333","","13/09/08,14:24:43+08"
supprimeCaractere(buffer_by_line[2],'"'); // ' " ' sans espace. J'ai aussi essayé "\"" sans succes
void supprimeCaractere(char *chaine, char caractere)
{
 
  char *p, *q;

  p = chaine;
  // Je parcours p tant que le caracter n'est pas egal à "
  while (*p != caractere) {
    if (! *p) // ??
      return;  // Jje quitte la boucle
    p++; // si non j'incrémente
  }
  q = p; // q prend la valeur de p
  do { // fait tant que..
    p++; // incremente p
    while (*p == caractere) // tant que le caractere est esgal à "
      p++; // increment
    *q++ = *p; // q prend la valeur de p et q incremente
  } while (*p); // ... tant que ???
 
  Serial.print("Supp caracter : ");Serial.println(p);
}

Si
Code:

...
} while (*p);
  Serial.print("Supp caracter : ");Serial.println(p); // p n'affiche rien
si
Code:

...
} while (!*p);
  Serial.print("Supp caracter : ");Serial.println(p); // que le premier " est supprimé

Si tu étais par geneve, je te payerai une bonne quinte!!!!  smiley-cool
38  International / Français / Re: Problème de conversion sur un char on: September 19, 2014, 10:33:05 am
Salut _pepe_

Encore Merci,
Ca ne marche pas, il me supprime que le premier!

Code:
void supprimeCaractere(char *chaine, char caractere)
{
  char *p, *q;

  p = chaine;
  while (*p != caractere) {
    if (! *p)
      return;
    p++;
  }
  q = p;
  do {
    p++;
    while (*p == caractere)
      p++;
    *q++ = *p;
  } while (! *p);
 
  Serial.print("Supp caracter : ");Serial.println(p);
}
Supp caracter : REC READ","33333","","13/09/08,14:24:43+08"

J'ai ca : +CMGR: "REC READ","33333","","13/09/08,14:24:43+08"
et je dois avoir ca : +CMGR: REC READ,33333,,13/09/08,14:24:43+08

Je dois tous les enlever!
Je prend note de ta remarque sur les ". En effet, mais dans mon cas, j'ai besoin de ces informations sans ".

Je suis comme même surpris qu'il n'y ait pas de fonction comme en php str_replcae('"','',$variable)?
39  Using Arduino / Programming Questions / Re: How can I split a String or a Char on: September 18, 2014, 10:42:05 am
Hello, as I wrote, below I tried it.
What I need is to remove the "  smiley

it print this:
Code:
0:+CMGR: "REC READ",
1:"55555",
2:"",
3:"13/09/08,
4:14:25:34+08"

And I want that:
Code:
0:+CMGR: "REC READ"
1:55555
2:
3:13/09/08
4:14:25:34+08

Cheers
40  International / Français / Re: Problème de conversion sur un char on: September 18, 2014, 09:19:19 am
Hello

Puis-je te demander un dernier truc.
Code:
void splitString(char *ligne, char **splitedString)
{
 
  char *p = ligne;
  int i = 0;
  splitedString[i++] = p;
  while (*p) {
   
    if (*p==',') {
      *p++ = '\0';
      if (i<NBVALS){
       
         splitedString[i++] = p;
      }
       
    } else
    {
      p++;
    }
 
  }
  while(i<NBVALS)
    splitedString[i++] = p;
   
}
Ci-dessus m'affiche ceci
Quote
0:+CMGR: "REC READ"
1:"+4176000000"
2:""
3:"13/09/30
4:00:02:36+08"
J'aimerais ceci
Quote
0:+CMGR: "REC READ" (s il n y a pas les " ici, ccest pas grave)
1:+4176000000
2:
3:13/09/30
4:00:02:36+08

Soit sans les ".

J'ai chercher un super moent a modifier la fonction ci dessus, mais sans succès. Idéalement, j'aimerais passer en parametre le caracter, ou les caracter à supprimer. Mias pour le moment ca me va très bien, si les " sont supprimer, tout simplement.

Après je crois que je suis au bout  smiley smiley smiley smiley
Merci
41  Using Arduino / Programming Questions / How can I split a String or a Char on: September 18, 2014, 08:15:52 am
Dear All,

I am looking to split a string as would do explode in PHP.

Here is code with explication

Code:
boolean sms_read(int sms_pos,char sms_from_number, char *sms_date, char *sms_time, char *sms_text)
{
  // Definy a variable
  char cmd[12];
  // Set the command
  sprintf(cmd,"AT+CMGR=%d,1",sms_pos);
  //Send the commans
  sendATcommand(cmd,"OK",2000,true,false,true); // This work.

  // sendATcommand will save the repsonse into a buffer call buffer_by_line. Each line will be save in a row. See below
 
 
  // It check the content of buffer_by_line
  for(int b =0; b<NBLINES;b++)
  {
    Serial.print(b);
    Serial.print(F(" : "));
    Serial.println(buffer_by_line[b]);
  }
  /* Display buffer_by_line
  0 : AT+CMGR=2,1
  1 :
  2 : +CMGR: "REC READ","55555","","13/09/08,14:25:34+08"
  3 : Das von Ihnen gesendete Keyword ist leider falsch. Le mot cle envoye est malheureusement faux.
  4 :
  5 :
  */
 
  // I display the SMS reveived message
  Serial.print(F("Message :")); Serial.println(buffer_by_line[3]);
 
  // Now I need those part: 5555,  13/09/08 and 14:25:34+08
 
  // Donc j'utilise une des fonction de _pepe_. Mais ca bug de mon cote
  splitString(buffer_by_line[2], splitedString, ",");
 
  Serial.print(F("From :")); Serial.println(buffer_by_line[2]);
 
}

Juste above I am using a function to split the content of buffer_by_line[2] in order to have the result as follow
Quote
0:+CMGR: "REC READ",
1:"55555",
2:"",
3:"13/09/08,
4:14:25:34+08"
I still need to remove all ".
I
Code:
n php, there a function str_replace('"',''); Is there something similar woth C++, to remove "??

That line
Code:
splitString(buffer_by_line[2], splitedString, ",");
generate that error
Quote
sim908_cooking:814: error: cannot convert 'char*' to 'char**' for argument '2' to 'void splitString(char*, char**, char)'
However splitString() ask 3 char, and I sent 3 char, no????????

I also tryed
Code:
char *c = strtok(buffer_by_line[2], ",");
 
  for(int cc=0; cc<strlen(c); cc++)
  {
    Serial.print(cc);Serial.print(":");Serial.println(c[cc]);
  }

which display
Quote
0:+
1:C
2:M
3:G
4:R
5::
6:
7:"
8:R
9:E
10:C
11:
12:R
13:E
14:A
15:D
16:"


Here is the function splitString()
Code:
// SlitString
#define NBVALS 14
char splitedString[NBVALS];
void splitString(char *ligne, char **splitedString, char delimiter)
{
  char *p = ligne;
  int i = 0;
  splitedString[i++] = p;
  while (*p) {
    //if (*p==',') {
    if(*p = delimiter){
      *p++ = '\0';
      if (i<NBVALS)
         splitedString[i++] = p;
    } else
      p++;
  }
  while(i<NBVALS)
    splitedString[i++] = p;
}

Many thank for your help!!!!
42  International / Français / Re: Problème de conversion sur un char on: September 18, 2014, 07:29:25 am
Aïe!, ouiiiii  smiley-small
Mais le problème reste à ce niveau
Code:
splitString(buffer_by_line[2], splitedString, ",");
43  International / Français / Re: Problème de conversion sur un char on: September 18, 2014, 07:14:22 am
Salut _pepe_ et tous,

D'abord _pepe_ j'aimerais encore te remercie. Tes fonctions et aide m'ont vachement aidé!!!!!

Aussi, je me suis trompé dans mon exemple. Je remets le code correct avec explication.
Ensuite, je collerai les fonction de _pele_ qui pourrait être utile à d'autre.
Ensuite, je poserai mon problème, car il est toujours là. (J'ai encore du mal avec les char et pointer)

Code:
boolean sms_read(int sms_pos,char sms_from_number, char *sms_date, char *sms_time, char *sms_text)
{
  // Definie une variable
  char cmd[12];
  // Defini la command
  sprintf(cmd,"AT+CMGR=%d,1",sms_pos);
  //execute la commande et place la réponse dans buffer
  sendATcommand(cmd,"OK",2000,true,false,true); // commande, attend pour le OK, ln, retourne uniquementla réponse de la commande, debug
  // Met chaque ligne du bouffer dans un array 0:AT+CMGR=1,1, 1:, 2:+CMGR: "REC READ","33333","","13/09/08,14:24:43+08", 3:, 4:OK
 
  // La fonction sendATcommand enregistrer le buffer par ligne dans buffer_by_line
 
  // Ci-dessous je controlle buffer_by_line
  for(int b =0; b<NBLINES;b++)
  {
    Serial.print(b);
    Serial.print(F(" : "));
    Serial.println(buffer_by_line[b]);
  }
  /* ce qui affiche ceci, donc OK
  0 : AT+CMGR=2,1
  1 :
  2 : +CMGR: "REC READ","55555","","13/09/08,14:25:34+08"
  3 : Das von Ihnen gesendete Keyword ist leider falsch. Le mot cle envoye est malheureusement faux.
  4 :
  5 :
  */
 
  // J'affiche le message recu
  Serial.print(F("Message :")); Serial.println(buffer_by_line[3]);
 
  // Maintenant j'ai besoin de 5555, de 13/09/08 et de 14:25:34+08
 
  // Donc j'utilise une des fonction de _pepe_. Mais ca bug de mon cote
  splitString(buffer_by_line[2], splitedString, ",");
 
  Serial.print(F("From :")); Serial.println(buffer_by_line[2]);
 
}

Ci-dessu, j'utilise un fonction qui va splité le contenu de buffer_by_line[2] et avoir le résultat de splitedSttrig comme ceci
Quote
0:+CMGR: "REC READ",
1:"55555",
2:"",
3:"13/09/08,
4:14:25:34+08"
Il faudra aussi que je trouve une solution pour supprimer les ". En PHP, il y str_replace('"','');, mais en C++??

Dans tous les cas, ceci
Code:
splitString(buffer_by_line[2], splitedString, ",");
m'affiche un message d'erreur
Quote
sim908_cooking:814: error: cannot convert 'char*' to 'char**' for argument '2' to 'void splitString(char*, char**, char)'
Pourtant splitString() demand trois char, et je lui envoie trois char, non????????

Moi je crois que je ne métrise pas les * comme char * var[], ou encore char **var[]; smiley-confuse smiley-confuse

Voilà la finction splitString de _pepe_. J'ai ajouté un troisième paramètre.
Code:
// SlitString
#define NBVALS 14
char splitedString[NBVALS];
void splitString(char *ligne, char **splitedString, char delimiter)
{
  char *p = ligne;
  int i = 0;
  splitedString[i++] = p;
  while (*p) {
    //if (*p==',') {
    if(*p = delimiter){
      *p++ = '\0';
      if (i<NBVALS)
         splitedString[i++] = p;
    } else
      p++;
  }
  while(i<NBVALS)
    splitedString[i++] = p;
}




Pour info, la function qui me permets d'avoir le buffer par ligne est la suivante. Ca fonctionne
Code:
// bufferByLine
#define NBLINES 6
char *buffer_by_line[NBLINES];
void bufferByLine(char *buffers, char **buffer_by_line) // Buffer, resulta in, nb of line
{
  char *p = buffers;
  int i = 0;

  buffer_by_line[i++] = p;

  while (*p) {
    if (*p=='\n') {
      *p++ = '\0';
      if (*p=='\r')
        *p++ = '\0';
      if (i<NBLINES)
         buffer_by_line[i++] = p;
    } else
    if (*p=='\r') {
      *p++ = '\0';
      if (*p=='\n')
        *p++ = '\0';
      if (i<NBLINES)
         buffer_by_line[i++] = p;
    } else
      p++;
  }
  while(i<NBLINES)
    buffer_by_line[i++] = p;
}
44  International / Français / Re: Problème de conversion sur un char on: September 18, 2014, 03:03:41 am
Pardon, le message d'erreur est exactement (en effet j'avais oublié un r et....... * smiley-confuse
Quote
sim908_cooking:799: error: invalid conversion from 'char' to 'const char*'

Non non, c'est bien char qui remplace un autre.
45  International / Français / Problème de conversion sur un char on: September 18, 2014, 02:44:25 am
Bonjour,
Je m'excuse si je ne métrise pas encore bien les char.
Mais j'ai ce message d'erreur qui s'affiche quand je compile mon code
Quote
Erruer: Invalid conversion  'char' to 'const char'
à ce niveau
Code:
strcpy(sms_from_number,c[1]);


Voici mon code
Code:
char sms_from[15];
boolean sms_read(int sms_pos,char *sms_from_number, char *sms_date, char *sms_time, char *sms_text)
{
  // Definie une variable
  char cmd[12];
  // Defini la command
  sprintf(cmd,"AT+CMGR=%d,1",sms_pos);
  execute la commande et place la réponse dans buffer
  sendATcommand(cmd,"OK",2000,true,false,true); // commande, attend pour le OK, ln, retourne uniquementla réponse de la commande, debug
  // Met chaque ligne du bouffer dans un array 0:AT+CMGR=1,1, 1:, 2:+CMGR: "REC READ","33333","","13/09/08,14:24:43+08", 3:, 4:OK
  bufferByLine(buffer, buffer_by_line);
  // Split la lign 2, delimiter par une virgule
  char * c = strtok(buffer_by_line[2],",");
  /*
  0:+CMGR: "REC READ",
  1:"+41763334455"
  2:""
  3:"13/09/08
  4:14:24:43+08"
  */
 
  Serial.println("-----");
    Serial.print(F("From : "));Serial.println(c[1]);
    strcpy(sms_from_number,c[1]); // Erruer: Invalide conversion  'cha' to 'const char'
    Serial.print(F("Date : "));Serial.println(c[3]);
    //strcpy(sms_date,c[3]);
    //strcpy(sms_time,c[4]);
    Serial.print(F("Message : "));
    Serial.println(buffer_by_line[3]);
 
}
Je ne sais pas si ca se résout avec un *. Ce que je ne comprnds pas non plus c'est strcpy est fait pour copier des char, non?

Merci
Pages: 1 2 [3] 4 5 ... 33