I2C onReceive 处理程序仅被调用一次。

5

我遇到了在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!");
}

在这个测试设置中,发送者每秒发送一个字节,让接收者通过打印一条消息来响应。但是,消息只会被打印一次。当我重置从设备时,它会再次打印,但只有一次。
有任何想法是怎么回事?
1个回答

7

您必须确保从流中读取所有字节,否则它似乎会阻塞。 将您的事件处理程序编写成以下方式,这样您就可以多次调用它。

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

1
谢谢!虽然项目已经结束了一段时间,但这个信息很有用。我会记住它以备将来参考,并在确认后接受答案。 - JorenHeit
你有机会确认了吗? - theUser
Joren,老兄。你确认那个家伙了吗? - theUser
Joren,老兄,好久不见。我们应该为五周年纪念日做点特别的事情,庆祝没有选择这个作为正确答案。 - theUser
非常感谢 :D - theUser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接