2014-12-30 11 views
5

Ich habe Probleme bei der Kommunikation zwischen Arduino über I2C. Aus irgendeinem Grund wird der Handler onReceive nur einmal aufgerufen.I2C onReceive-Handler nur einmal aufgerufen

Master-Code (Sender):

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

Slave-Code (Empfänger):

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

Die Idee bei diesem Test-Setup der Sender ein Byte senden jeden zu haben ist Zweitens, und lassen Sie den Empfänger darauf reagieren, indem Sie eine Nachricht drucken. Die Nachricht wird jedoch nur einmal gedruckt. Wenn ich den Slave zurücksetze, wird er erneut gedruckt, aber nur einmal.

Irgendwelche Ideen, woher das kommen könnte?

Antwort

4

Sie müssen sicherstellen, dass Sie alle Bytes aus dem Stream lesen. Sonst scheint es zu blockieren. Lassen Sie Ihren Event-Handler so aussehen. Sie können es also mehrmals anrufen.

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

Vielen Dank! Sehr gut zu wissen, auch wenn das Projekt vor einiger Zeit zu Ende gegangen ist. Ich werde dies für die Zukunft in Erinnerung behalten und werde die Antwort akzeptieren, wenn ich die Möglichkeit habe, dies zu bestätigen. – JorenHeit

Verwandte Themen