Go Down

Topic: serial.print et char* (Read 556 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy