Probleme int 0 pas egal a 0...

Bonjour a tous. Je vous explique mon problème incompréhensible pour moi mais qui est surement une erreur basique pour les pro :d. voici mon projet détaillé :
-j’ai 2 cartes Arduino qui communique en i2c.
-le maitre envoie un byte a l’esclave ( chiffre entre 0 et 4 )
-l’esclave sauvegarde le numéro reçu dans une variable de type “byte” ( on appellera cette variable X)
-si X != 10 l’esclave exécute un ordre suivant le numéro X ( si X==1 faire tel chose…) et X est aussi tôt mis a X=10.

voici mon script réduit au minimum pour plus de recomposition

#include <Wire.h> 

byte x = 10;

void setup(){
  Wire.begin(8);              
  Wire.onReceive(receiveEvent); 
  Serial.begin(250000);
}

void loop(){  
  
  if (x != 10 ){
    if (x == 0) { 
      Serial.print("printA"); 
    }
    else{
      Serial.print("printB"); Serial.println(x);
    }
    
    x = 10;    
  }
  
}

void receiveEvent(int howMany) {
  x = Wire.read();  
  
}

Ce script fonctionne parfaitement 9fois sur 10. Pour les testes, le maitre envoi seulement le numéro 0.
Quand ça ne fonctionne pas, le problème est le suivant:
Le maitre envoi une fois de plus 0 donc if (x != 10 ) devient vrai mais if (x == 0) n’est pas vrai (printA ne fonctionne pas). Donc logiquement c’est que X!=0. Mais la ou je comprend rien c’est que après printB il y a bien écrit 0!!! Donc x est bien égal a 0…

j’ai essayer de remplace “byte x = 10;” pas “int x = 10;” mais sa ne change rien.
Quelqu’un pourrait me dire pourquoi ça fait çà 1fois sur 10 alors que le reste du temps ça fonctionne bien??
j’ai presque plus de cheveux au secoure ;D.

Met une perruque !!!

Tu devrais t’inspirer de cet exemple.

Ton problème vient peut-être du fait que tu ne testes pas si le buffer de lecture est vide.

  while (1 < Wire.available()) { // loop through all but the last

Ce que tu prends pour un 0 est peut-être le dernier caractère de “10” : tu peux tester avec “11” au lieu de “10”.

Bonjour,

Tu es sur que le maitre envoie bien 0 et non le caractère '0' ?

Ton problème vient peut-être du fait que tu ne testes pas si le buffer de lecture est vide.

while (1 < Wire.available()) { // loop through all but the last

oui desolé je ne l’ai pas mis dans mon exemple mais je l’ai bien mis dans mon script d’origine.

Ce que tu prends pour un 0 est peut-être le dernier caractère de “10” : tu peux tester avec “11” au lieu de “10”.

Tu veux dire la ou je met byte x = 10, je remplace les 10 par des 11?

Tu es sur que le maitre envoie bien 0 et non le caractère ‘0’ ?

oui j’en suis sure car le maitre envoi toujours la mème chose (avec une fonction qui n’est jamais modifier). Et sa fonctionne 9 fois sur 10 avec ce mème 0. Dans le doute j’ai essayer if (x == “0”) et mème if (x == 0.0)

Oui, teste en envoyant 11 et en comparant avec 11. Mais si tu avais mis le Wire.available, je pense que ce n’est pas ça.

j'ai essayer ca entre temps mais sa ne change rien :(.
sinon il y a un moyen de voir la valeur x en binaire? avec ça logiquement je devrais voir si c'est un vrai 0?

Voir ici

Serial.print(78, BIN) gives "1001110"

merci lesept .
Ca y est c'est bon, je n'ai plus de cheveux j'ai tout arraché :o. Incompressible. J'ai ajouté seulement Serial.print(x, BIN), et depuis je n'arrive mème plus a avoir mon erreur... Je suis sur que ça va recommencé quand je vais pas m'y attendre.

Alors il devait trouver que tu avais trop de cheveux...

tonytony72:
je n'arrive mème plus a avoir mon erreur... Je suis sur que ça va recommencé quand je vais pas m'y attendre.

Et oui, c'est si bon l'informatique :slight_smile:

postez le code qui envoie les données...

en plus rien ne vous dit que (suivant la vitesse d'envoi) vous ne serez pas interrompu dans la loop par un appel à receiveEvent() entre le moment où vous faites le test et le moment où vous imprimez le résultat...