2014-12-30 14 views
5

Ho problemi a comunicare tra Arduino e I2C. Per qualche motivo, il gestore onReceive viene chiamato solo una volta.I2C onReceive-handler chiamato solo una volta

Codice Master (mittente):

#include <Wire.h>                  
#include "i2csettings.h" // defines address 

void setup() 
{ 
    Wire.begin(I2C_MASTER_ADDRESS); 
} 

void loop() 
{     
    Wire.beginTransmission(I2C_SLAVE_ADDRESS); 
    Wire.write(0x11); 
    Wire.endTransmission(); 

    delay(1000);  
} 

Codice Slave (ricevitore):

#include <Wire.h> 
#include "i2csettings.h" 

void takeAction(int); 

void setup() 
{ 
    Serial.begin(9600); 

    Wire.begin(I2C_SLAVE_ADDRESS); 
    Wire.onReceive(takeAction); 
} 

void loop() 
{} 

void takeAction(int nBytes) 
{ 
    Serial.println("Action!"); 
} 

L'idea in questo test-setup è quello di avere il mittente invia un byte ogni secondo, e lasciare che il destinatario agisca su questo stampando un messaggio. Tuttavia, il messaggio viene stampato solo una volta. Quando resetto lo slave, viene stampato di nuovo, ma solo una volta.

Qualche idea da dove possa venire?

risposta

4

Devi assicurarti di leggere tutti i byte dallo stream. Altrimenti sembra bloccare. Crea il tuo gestore di eventi in questo modo. Quindi puoi chiamarlo più volte.

void takeAction(int nBytes) 
{ 
    Serial.println("Action!"); 
    while(Wire.available()) 
    { 
    Wire.read(); 
    } 
    return; 
} 
+1

Grazie! Molto buono a sapersi, anche se il progetto è finito da un po 'di tempo fa. Terrò questo a mente per riferimenti futuri e accetterò la risposta quando avrò la possibilità di confermarlo. – JorenHeit