arduino - I2C onReceive-handler 只调用一次

标签 arduino i2c

我无法通过 I2C 在 Arduino 之间进行通信。出于某种原因,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 时,它​​会再次打印,但只打印一次。

这可能来自哪里的任何想法?

最佳答案

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

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

关于arduino - I2C onReceive-handler 只调用一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27705156/

相关文章:

c++ - Arduino-PROGMEM avr/pgmspace.h出现问题

c - 使用 ESP32 写入 I2C EEPROM 页的问题

c - STM32F4 作为 I2C 从设备。为什么 "void I2C1_ER_IRQHandler(void)"在 "HAL_I2C_Slave_Transmit_DMA"之后执行?

python - 数据传输错误 I2C RasPi->Arduino

c++ - 预处理器/条件变量定义

c++ - 对于基于 Arduino Sketch 的照度计, 'loop' 之外的功能不会被触发/触发

c++ - 如何在 Arduino 上格式化长加千位分隔符

linux - 为什么 i2cset 会发送额外的字节?

通过 UART 进行 iPad 配件通信

c - 函数指针数组,传递数组中定义的值