I2C onReceive-handler仅调用一次

时间:2014-12-30 12:03:12

标签: arduino i2c

我在Arduino之间通过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时,它会再次打印,但只打印一次。

这可能来自哪些想法?

1 个答案:

答案 0 :(得分:5)

您必须确保从流中读取所有字节。 其他明智的似乎是阻止。 使您的事件处理程序看起来像这样。所以你可以多次调用它。

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