2014-12-30 3 views
5

У меня возникли проблемы с сообщением между Arduino's над I2C. По какой-то причине обработчик onReceive вызывается только один раз.I2C onReceive-обработчик называется только один раз

Мастер код (отправитель):

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

Подчиненный код (приемник):

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

Идея в этом тест-установки, чтобы иметь отправитель посылает байт каждый во-вторых, и пусть получатель действует на это, печатая сообщение. Однако сообщение печатается только один раз. Когда я перезагружаю Slave, он снова печатается, но только один раз.

Любые идеи, из которых это может произойти?

ответ

4

Вы должны убедиться, что вы прочитали все байты из потока. Другие мудрые, похоже, блокируются. Сделайте свой обработчик событий таким. Поэтому вы можете называть его несколько раз.

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

Спасибо! Очень хорошо знать, хотя проект подошел к концу некоторое время назад. Я буду иметь это в виду для будущей справки и буду принимать ответ, когда я получу шанс подтвердить это. – JorenHeit