Show Posts
Pages: [1] 2 3 ... 31
1  International / Français / Re: Comment convertir un char en un ...... char!!!! on: Today at 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
2  International / Français / Re: Comment convertir un char en un ...... char!!!! on: Today at 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)
{
3  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!!!!
4  International / Français / [resolu]Re: Mon Leonardo perd la connection USB on: September 20, 2014, 01:11:03 pm
Merci _pepe_
5  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
6  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?
7  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
8  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
9  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(
10  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
11  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
12  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)?
13  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
14  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
15  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!!!!
Pages: [1] 2 3 ... 31