Tableau et index en byte

Salut à tous !

Voici un petit bout de code qui fonctionne parfaitement qui renvoi bêtement ce qu'on lui envoi par le port série :

if(Serial.available()){
    
    delay(20);
    int i;  
    char Buffer[10];
    
   while(Serial.available()){
       Buffer[i++]=Serial.read();
       Serial.print(Buffer[i-1]);
      }
}

Maintenant si au lieu de :

int i;

je fais :

byte i;

Ca ne marche plus du tout ! Je reçois un caractère bizarre (genre "&" mais pas exactement), en nombre égal au nombre de caractère que je devrait recevoir (donc la boucle et la lecture série fonctionnent bien) mais toujours le même. Et ceci bien entendu avec un index bien en-dessous de 255 ...

Une explication ?

Merci !!

Faudrait penser à initialiser i

Bin la déclaration réinitialise non ? En plus ça le fait dès le premier coup, même si je n'envoi qu'un seul caractère.

B@tto: Salut à tous !

Ca ne marche plus du tout ! Je reçois un caractère bizarre (genre "&" mais pas exactement), en nombre égal au nombre de caractère que je devrait recevoir (donc la boucle et la lecture série fonctionnent bien) mais toujours le même. Et ceci bien entendu avec un index bien en-dessous de 255 ...

Une explication ?

Merci !!

bonsoir pas de difference chez moi avec (testé en 9600 et 115200)

void setup() { 

  Serial.begin(115200); 
}
void loop() { 
 if(Serial.available()){
    
    delay(20);
    int i;  
    char Buffer[10];
    
   while(Serial.available()){
       Buffer[i++]=Serial.read();
       Serial.print(Buffer[i-1]);
      }
}

}

ou

void setup() { 

  Serial.begin(115200); 
}
void loop() { 
 if(Serial.available()){
    
    delay(20);
    byte i;  
    char Buffer[10];
    
   while(Serial.available()){
       Buffer[i++]=Serial.read();
       Serial.print(Buffer[i-1]);
      }
}

}

:o

Bon demain je test sur une autre board alors !!

Bonjour,

B@tto tu me déçois, tu m'avais habitué à mieux ;)

if(Serial.available()) {

  delay(20);
  int i;  // VARIABLE NON INITIALISE
  char Buffer[10];
    
  while(Serial.available()){
    Buffer[i++]=Serial.read(); // BUFFER OVERFLOW si i > 10
    Serial.print(Buffer[i-1]); // POST INCREMENTATION CONTRE PRODUCTIVE
  }
}

Donc maintenant on se la refait propre :

byte i = 0;
char buffer[10];
    
while(Serial.available() > 0) {
  buffer[i] = Serial.read();
  Serial.print(buffer[i]);
  if (++i == 10) i = 0;
}

Et maintenant avec 2sec de réflexion on se rend compte que buffer sert à rien ...

char buffer;

while(Serial.available() > 0) {
  buffer = Serial.read();
  Serial.print(buffer);
}

La buffer ne sert à rien, mais pas dans la suite du prog :wink:

Buffer n’overflow pas car je n’envois jamais + de 10 caractères, et le bug n’arrive pas avec int !! D’où mon questionnement.

int i; <=> int i=0; nan ?

Du coup tu vas m’ôter d’un doute : je croyais que i++ ==> incrémentation après l’exécution de la ligne de code, ++i avant. Jme gourre ?

Dans tous les cas int => pas bug byte ==> bug :s

J’ai eu le même genre de bug sur Energia, j’ai dû modif des libs en changeant les char en int …

B@tto: Buffer n'overflow pas car je n'envois jamais + de 10 caractères, et le bug n'arrive pas avec int !! D'où mon questionnement.

Jusqu'au jour où tu va changer d'avis et que ton truc va planter ;) Rajouter un if ça coute rien et ça évite bien des problèmes.

Pour ton problème initialise ta variable "i" à zéro ça devrait déjà aider. Que tu utilises un int ou un byte, avec l'initialisation le résultat DOIT être le même.

B@tto: Du coup tu vas m'ôter d'un doute : je croyais que i++ ==> incrémentation après l’exécution de la ligne de code, ++i avant. Jme gourre ?

Si c'est ça. i++ post incrémentation ++i pré incrémentation

Dans ton code tu post-incrémentes inutilement vu que tu fait -1 derrière. Autant utiliser i directement puis l'incrémenter plus tard, en testant la valeur au passage.

B@tto: J'ai eu le même genre de bug sur Energia, j'ai dû modif des libs en changeant les char en int ...

Energia -> MSP430 -> CPU 16 bits. Arduino -> AVR - > CPU 8 bits. Les types ne sont donc pas forcément traités de la même façon entre les deux compilateurs. Aprés un char devrait normalement toujours faire 1 octet qu'importe le compilateur/cpu, c'est bizarre ton truc.

skywodd:

B@tto: Buffer n'overflow pas car je n'envois jamais + de 10 caractères, et le bug n'arrive pas avec int !! D'où mon questionnement.

Jusqu'au jour où tu va changer d'avis et que ton truc va planter ;) Rajouter un if ça coute rien et ça évite bien des problèmes.

Non mais la j'ai posté le code qui me pose un problème fondamental. Tu penses bien qu'une fois appliqué c'est un peu plus édulcoré ;)

skywodd: Dans ton code tu post-incrémentes inutilement vu que tu fait -1 derrière. Autant utiliser i directement puis l'incrémenter plus tard, en testant la valeur au passage.

C'est pour le debug évidemment ;)

Derrière Buffer est traité, mais comme ça me donnait toujours des trucs très bizarre je me suis demandé d'où ça venait ... Le code final ne comporte pas le Serial.print()

skywodd: Energia -> MSP430 -> CPU 16 bits. Arduino -> AVR - > CPU 8 bits. Les types ne sont donc pas forcément traités de la même façon entre les deux compilateurs. Aprés un char devrait normalement toujours faire 1 octet qu'importe le compilateur/cpu, c'est bizarre ton truc.

On est bien d'accord ... Si dans les lib j'initialisais mes loop avec des bytes ==> COMPILATION FAILED Avec des int ==> OK J'ai pas cherché à comprendre c'était plus de mon ressort :s D'autres bugs bizarres sur Energia m'ont fait décroché de cet IDE au demeurant sympa ...