2014-12-30 18 views
5

Mam problem z komunikacją między Arduino a I2C. Z jakiegoś powodu, obsługa onReceive jest wywoływana tylko raz.I2C onReceive-handler wywoływany tylko raz

Kod Główny (nadawca):

#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);  
} 

Kod slave (odbiornik):

#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!"); 
} 

Chodzi w tym test-setup jest, aby nadawca wysyła bajt każdego po drugie, niech odbiorca zareaguje na to, drukując wiadomość. Jednak wiadomość jest drukowana tylko raz. Po zresetowaniu urządzenia Slave drukowane jest ponownie, ale tylko raz.

Jakieś pomysły, skąd może to pochodzić?

Odpowiedz

4

Musisz upewnić się, że czytasz wszystkie bajty ze strumienia. Poza tym wydaje się, że blokuje. Sprawdź, jak wygląda program obsługi zdarzeń. Możesz więc nazwać to wiele razy.

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

Dzięki! Bardzo dobrze wiedzieć, mimo że projekt dobiegł końca. Będę o tym pamiętać, by móc się z nim zapoznać w przyszłości i zaakceptuję odpowiedź, gdy będę miał szansę to potwierdzić. – JorenHeit