Recuperer une variable de Wire.onReceive(receiveEvent)

Bonjour,

Mon niveau de programmation n'est pas énorme, peut-être pourriez-vous m'aider.

Je souhaite récupérer la variable x déclarée dans le fonction receiveEvent() pour pouvoir la réutiliser dans la fonction loop.

Je ne sais pas comment faire, peut-être par l'adresse, peut-être avec une autre méthode?
Je suis bloqué malgré quelques recherches google ainsi que sur le forum.

Merci d'avance pour vos réponses

#include <Wire.h>

void setup()
{
  Wire.begin(4);                // join i2c bus with address #4
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(9600);           // start serial for output
}

void loop()
{
  delay(100);
}

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany)
{
  while(1 < Wire.available()) // loop through all but the last
  {
    char c = Wire.read(); // receive byte as a character
    Serial.print(c);         // print the character
  }
  int x = Wire.read();    // receive byte as an integer
  Serial.println(x);         // print the integer
}

c'est le code d'exemple MasterReader standard...

il reçoivent dans la fonction tous les octets en attente, ignore les premier et ne conserve que le dernier dans x
comme x est défini en variable locale, elle disparait à la fin de la fonction. si vous la définissez en variable globale alors elle sera dispo. (volatile int x)

il faudra aussi un moyen pour la loop() de savoir que vous avez reçu une nouvelle donnée.

peut-être un truc du genre

#include <Wire.h>
volatile int x = -1;

void setup()
{
  Wire.begin(4);                // join i2c bus with address #4
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(115200);           // start serial for output
}

void loop()
{
  if (x != -1) {
    Serial.println((char) x);
    x = -1;
  }
}


// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany)
{
  while(Wire.available() > 1) Wire.read(); // ignore les premiers
  x = Wire.read();    // reçoit le dernier octet
}

Merci beaucoup,

volatile est une notion que je ne connaissais pas.

Ca marche !

:slight_smile: cool

volatile est important car la fonction receiveEvent est appelée dans le contexte d'une interruption et si on ne le dit pas au compilateur que x peut changer sans qu'il s'en aperçoive, il peut faire des optimisations dans la loop qui ne verra jamais passer la nouvelle valeur

1 Like