Arduino上的Wire.onReceive()函数

Wire.onReceive() function on Arduino

本文关键字:函数 onReceive 上的 Wire Arduino      更新时间:2023-10-16

我正在尝试采用Arduino Wire库给出的此示例中的内容,并将其应用于我正在编写的程序。

这是我的代码。Comm.NDP[]语句是未保存在此文件中的其他类实例,因此我相信您可以忽略它们。

**
* I2C.cpp handles sending of event messages
*    between the LORA and MEGA via I2C protocol.
*/
#include "I2C.h"
#include "DATA.h"
#include "Globals.h"
#include <Wire.h>
#include <Arduino.h>
/**
 * Constructor used to reference all other variables & functions.
 */
I2C::I2C() {
}
/**
 * Assigns the proper address to the current micro controller.
 */
void I2C::initialize() {
  //Sets the address for the current micro controller.
  //   Mega - 0
  //   LoRa - 1
  Wire.begin(0);
  Wire.setClock(8000000);
  //Registers recieveEvent as a interrupt.
  Wire.onReceive(receiveEvent); // register event
}
/**
 * Receives byte over I2C Connection.
 */
static void receiveEvent(int howmany) {
  //Iterator used below.
  int i = 0;
  for(i=0;i<120;i++) {
    Comm.NDP[i] = ' ';
  }
  //Resets iterator.
  i = 0;
  //Checks to see if serial port is empty.
  while (1 < Wire.available()) {
    //Reads in single character from serial port.
    char character = Wire.read();
    NDP[i] = character;
    i++;
  }
  Serial.println(Comm.NDP);
}

来自Arduino的Wire.h库的示例代码

#include <Wire.h>
void setup() {
  Wire.begin(8); // join i2c bus with address #8
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(9600); // start serial for output
}
void loop() {
  delay(100);
}
// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany) {
  while (1 < Wire.available()) { // loop through all but the last
    char c = Wire.read(); // receive byte as a character
    Serial.print(c); // print the character
  }
  int x = Wire.read(); // receive byte as an integer
  Serial.println(x); // print the integer
}

我从Arduino IDE收到此错误。

错误:非静态成员函数的使用无效

Wire.onReceive(receiveEvent); // register event
                          ^

退出状态 1非静态成员函数的使用无效

您缺少首次使用前的receiveEvent声明。要么在begin之前移动它的定义,要么在那里添加:

void receiveEvent(int howMany);