我在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时,它会再次打印,但只打印一次。
这可能来自哪些想法?
答案 0 :(得分:5)
您必须确保从流中读取所有字节。 其他明智的似乎是阻止。 使您的事件处理程序看起来像这样。所以你可以多次调用它。
void takeAction(int nBytes)
{
Serial.println("Action!");
while(Wire.available())
{
Wire.read();
}
return;
}