Petit pb de chaine de caractère...

Bonjour à tous,
Je reviens sur le site car j’ai un pb, ayant fait un programme avec des string qui marche mais bug souvent du fait que ces objets dépasse la capacité de la ram, j’ai décidé de passer mes string en tableau de caractère.
Et je n’y arrive pas, j’ai commencé en traitant d’abord l’entrée serial, je vous met le code qui bug si quelqu’un avit une idée.
La premiere ligne s’inscrit bien, les suivantes c’est du grand n’importe quoi.

char str[30] = "";
boolean stringComplete  = false;  // whether the string is complete
int compt=0;
void setup()
{
 Serial.begin(9600);
   while (!Serial) {
   ; // wait for serial port to connect. Needed for Leonardo only
  }
 Serial.println("Demarrage Programme :");
 Serial.println("---------------------");
}
 void loop()
{
 if (stringComplete) {
   for(int i=0;i<(compt);i++){
     Serial.print(str[i]);
     
   };
/*for(int i=0;i<(compt-1);i++){
     //str[i]='';
   };*/
   compt = 0;
   stringComplete = false;
   Serial.println();
 }
}
void serialEvent() {
  while (Serial.available()) {
    char inChar = (char)Serial.read(); 
    str[compt] += inChar;
    compt ++;
    if (inChar == '\n') {
      stringComplete = true;
    } 
  }
}

J’essaie aussi de faire une remise à ‘’ de str*=’’; dans une boucle mais celà me met une erreur, je ne comprend pas.*
Merci d’avance
Stéphane

Il y a quelques petites erreurs, la plus importantes me semblant être :

str[compt] += inChar;

Pourquoi “+=” ? Puisque tu utilises un index … Mets simplement “=”
Il faut également réinitialiser ton tableau, mais attention tu confonds le caractère NULL ‘\0’ et espace. Au final ça devrait marcher :

char str[30] ;
boolean stringComplete  = false;  // whether the string is complete
int compt=0;
void setup()
{
 Serial.begin(9600);
   while (!Serial) {
   ; // wait for serial port to connect. Needed for Leonardo only
  }
 Serial.println("Demarrage Programme :");
 Serial.println("---------------------");
}
 void loop()
{
 if (stringComplete) {
   for(int i=0;i<(compt);i++){
     Serial.print(str[i]);
      }
   compt = 0;
   stringComplete = false;
   Serial.println();
for(int i=0;i<30;i++){
     str[i]='\0';
   }

 }
}

void serialEvent() {

  while (Serial.available()) {
    str[compt] = Serial.read(); 
    compt ++;
    }
stringComplete=true;
  
}

Merci pour ta réponse B@tto. Ca marche, par contre si mon entrée dépasse 30 caractère je réinitialise ma liaison serial.
J'ai modifier le programme pour contrer celà, mais qu'est ce qui se passe au juste quand elle se réinitialise, je ne saisie pas trop.
J'ai vu aussi que tu avais supprimer in char, mais moi quand je fais celà le programme prend plus de place alors qu'il y a moins de variable, c'est bizarre.
Ton code

while (Serial.available()) {
    str[compt] = Serial.read(); 
    compt ++;
    }

Mon code

while (Serial.available()) {
    char inChar = Serial.read(); 
    str[compt] = inChar;  
    compt ++;
    if (compt>=30|| inChar== '\n') {
      stringComplete = true;
    } 
  }

Redis moi donc pour info pour le dépassement de caractère, celà m'intrigue.
A+ Stéphane

Autre question, es t'on obligé de réinitialiser la chaine de caractère entre chaque entré? Question de place toujours.

Qu'entends-tu exactement par réinitialiser la liaison ?

Sinon le "++" tu peux l'inclure dans la ligne str[compt]=Serial.read();

Après pour la place prise par le programme je peux pas te dire, ça dépasse mes compétences

Quand on a une chaine de carctère qui fait plus de 30 dans mon cas, la liaison serial se relance. Et j'ai de nouveau l'invite Demarrage Programme.
Pour le passage de chaine dans une fonction et la comparaison, je l'ai fait en String...

void parser(String a)
{
  Serial.print("Parser =");Serial.println(a);
  for (int i = 0; i <a.length(); i++){
    char caract=a[i];
    if (caract==';'||caract=='\n'||caract==',') {}
  };
}

Mais ayant trop galérer avant j'aimerais avoir une piste qui me facilite la vie et me permette de coder simplement. Si quelqu'un à un lien ou un exemple.
C'est la comparaison qui me bloque. Si je veux comparer ce qui est rentré à "Move" par exemple.
A+ Stéphane

Quand la chaine reçue fait plus de 30 caractères tu débordes du tableau et le programme écrase les autres variables placées à la suite du tableau. La longueur maximum pour la chaine c'est 29 caractères d'ailleurs pour être exact puisqu'il faut garder une place pour le terminateur.

Merci pour ta réponse fdunews.
Pour en revenir à mon code, car je dois avancé…
mon ancien code avec des Strings

void parser(String a)
{
  Serial.print("Parser =");Serial.println(a);
  for (int i = 0; i <a.length(); i++){
    char caract=a[i];
    if (caract==';'||caract=='\n'||caract==',') {
      if(readString!=""&&imove==1&& caract!=','&& d==0)  {imove=0;mouvement(1,15,stringToInt(readString));readString="";}
           readString="";
    }else {readString += caract; 
      if (readString=="move"  ||readString=="Move")       {imove=1;readString="";}
        }
  };
}

Mon nouveau avec des char mais qui n’est pas fini

void parser(char a[])
{
  Serial.print("Parser =");Serial.println(a);
  for (int i = 0; i <strlen(a); i++){
    char caract=a[i];
    if (caract==';'||caract=='\n'||caract==',') {
              }else {
      
    }
  };
}

Il ne fonctionne pas et je reste toujours dans la deuxième partie du if, je dois oublier quelque chose.
Si vous avez une piste et surtout me dire si c’est bien codé.
A+ Stéphane