serial.print et char*

bonsoir les gens, j'ai un petit problème :astonished:

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";

serial.print(str);

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

vohu: 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 ???

serial.print(str);

Bien sur que si qu'on peut ! O_o

Serial.print("Hello World");

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

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

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);

Roooo !! Le vilain !

Une chaine de caractéres en c/c++ se termine [u]toujours[/u] 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 ;)

Ca marche pas non plus :s

sortie :

v0
o1
h2
u3
4

  //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

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

vohu:
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 …

vohu:
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

yep ok :smiley:

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 :

  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);