Go Down

Topic: serial.print et char* (Read 520 times) previous topic - next topic

vohu

bonsoir les gens, j'ai un petit problème  :smiley-eek:


Je sais pas si c'est moi qui bug, ou si c'est normal, mais...

on ne peut pas serialprinter une chaine de caractère à la façon C ???
char *str = "ma chaine";

Code: [Select]
serial.print(str);


Ou on est obligé de faire une fonction qui affiche les char un par un ?

skywodd


Je sais pas si c'est moi qui bug, ou si c'est normal, mais...

on ne peut pas serialprinter une chaine de caractère à la façon C ???

Code: [Select]
serial.print(str);

Bien sur que si qu'on peut ! O_o

Serial.print("Hello World");
=
char *str = "Hello World";
Serial.print(str);

Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

vohu

#2
Feb 25, 2012, 08:35 pm Last Edit: Feb 25, 2012, 08:37 pm by vohu Reason: 1
ok, je dois être fatigué lol

je comprends pas ce qui fonctionne pas ici : (à savoir que quand je décommente //Serial.print(c); dans le IF, j'ai bien ce qu'il faut qui s'affiche

Code: [Select]
char val[20] = "";
 int nbrCar = 0;
 int d = false; //capture jusque '>'

 while(client.available())
 {
   char c = client.read();
   //Serial.print(c);

   if(c == '<') d = true;
   if(c == '>') d = false;

   if(d && c != '<')
   {
     val[++nbrCar] = c;
     //Serial.print(c);
   }

 }
 Serial.println(val);

skywodd

Roooo !! Le vilain !

Une chaine de caractéres en c/c++ se termine toujours par \0 ;)

Donc avant Serial.println(val);
val[++nbrCar] = '\0';

Ps: tu devrait check si nbrCar ne dépasse pas 20 sinon tu aurait un dépassement de tampon, et de gros soucis ;)
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

vohu

Ca marche pas non plus :s

sortie :

Quote
v0
o1
h2
u3
4



Code: [Select]
  //si connection OK
  char val[20] = "";
  int nbrCar = 0;
  int d = false; //capture jusque '>'

  while(client.available())
  {
    char c = client.read();
    //Serial.print(c);

    if(c == '<') d = true;
    if(c == '>') d = false;

    if(d && c != '<')
    {
      val[++nbrCar] = c;

      Serial.print(c);
      Serial.println(nbrCar -1,DEC);
    }

  }
  Serial.print(nbrCar,DEC);
  val[nbrCar] = '\0';
  Serial.println(val);



Pour la vérif de dépassement de la chaine je verai après

vohu

#5
Feb 25, 2012, 08:54 pm Last Edit: Feb 25, 2012, 08:56 pm by vohu Reason: 1
Bon... j'ai résolu le problème en ne faisant pas l'incrémentation dans : val[++nbrCar] = c;

Visiblement, l'incrémentation se faisant avant, ce qui fait que mon val[0] valait '\0'  et mon premier char était enregistré dans val[1], d'ou la chaine vide


Faudra que je vérifie si i++ ou ++i sont équivalents dans l'environement arduino



skywodd


Bon... j'ai résolu le problème en ne faisant pas l'incrémentation dans : val[++nbrCar] = c;

Visiblement, l'incrémentation se faisant avant, ce qui fait que mon val[0] valait '\0'  et mon premier char était enregistré dans val[1], d'ou la chaine vide

Logique vu que ++i incrémente i avant de faire la suite, contrairement à i++.
Effectivement je n'avais pas vu ton initialisation à "" au départ ...


Faudra que je vérifie si i++ ou ++i sont équivalents dans l'environement arduino

Damned! ++i et i++ ne sont pas du tout équivalent que ce soit avec l'ide arduino ou avec n'importe quelle compilateur c/c++ !

++i incrémente i avant de faire le reste du calcul.
ex:
i = 0;
test(++i); // -> test(1);

i++ incrémente i aprés avoir fait le reste du calcul.
ex:
i = 0;
test(i++); // test(0);
// -> i = 1
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

vohu

#7
Feb 25, 2012, 09:06 pm Last Edit: Feb 25, 2012, 09:07 pm by vohu Reason: 1
yep ok :D

moi j'inversais ! Donc forcément, ça ne pouvait pas aller...

Je m'étais toujours mis en tête que ++i incrémentait après l'affectation


Le code juste pour si un jour quelqu'un tombe la dessus :

Code: [Select]
  char val[21] = "";
  int nbrCar = 0;
  int d = false; //capture jusque '>'

  while(client.available())
  {
    char c = client.read();
    if(c == '<') d = true;
    if(c == '>') d = false;

    if(d && c != '<' && nbrCar < 21)
    {
      val[nbrCar++] = c;
      val[nbrCar] = '\0';
    }


  }
  Serial.println(val);

Go Up