2014-12-30 11 views
5

Tôi gặp sự cố khi liên lạc giữa Arduino trên I2C. Vì một lý do nào đó, trình xử lý onReceive chỉ được gọi một lần.I2C onReceive-handler được gọi chỉ một lần

Master Code (người gửi):

#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 Mã (receiver):

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

Ý tưởng trong này thử nghiệm thiết lập là phải có người gửi gửi một byte mỗi thứ hai, và để người nhận hành động bằng cách in một tin nhắn. Tuy nhiên, tin nhắn chỉ được in một lần. Khi tôi đặt lại Slave, nó được in một lần nữa, nhưng chỉ một lần.

Bất kỳ ý tưởng nào về điều này có thể đến từ đâu?

Trả lời

4

Bạn phải đảm bảo rằng bạn đã đọc tất cả các byte từ luồng. Một cách khôn ngoan khác dường như chặn. Làm cho trình xử lý sự kiện của bạn trông như thế này. Vì vậy, bạn có thể gọi nó nhiều lần.

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

Cảm ơn! Rất tốt để biết, mặc dù dự án đã kết thúc một thời gian trở lại. Tôi sẽ ghi nhớ điều này để tham khảo trong tương lai và sẽ chấp nhận câu trả lời khi tôi có cơ hội để xác nhận điều này. – JorenHeit

Các vấn đề liên quan