首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >I2C通信Raspberry Pi 3和Arduino

I2C通信Raspberry Pi 3和Arduino
EN

Stack Overflow用户
提问于 2016-09-06 16:42:46
回答 1查看 2.2K关注 0票数 1

(抱歉英语不好,我是德国人)

你好,程序员,

我正在尝试(没有成功)将数据从Raspberry Pi 3(主)发送到Arduino(奴隶):

下面是我的更新的 Arduino代码:

代码语言:javascript
复制
#include <Wire.h>
volatile bool flag = false;
void wireHandler(int numBytes)
{
  flag = true;
}
void setup()
{
  pinMode(13, OUTPUT);
  Wire.begin(0x23);
  Wire.onReceive(wireHandler);
}
void loop()
{
  delay(100);
  digitalWrite(13, flag);
}

我的Raspy代码(C++,g++ main.cpp -lwiringPi):

代码语言:javascript
复制
#include <iostream>
#include <wiringPi.h>
#include <wiringPiI2C.h>
int main(void)
{
    if(wiringPiSetup() == -1)
    {
        std::cerr << "wiringPiSetup() == -1\n";
        return 1;
    }
    if(wiringPiI2CSetup(0x39) == -1) //is 0x39 correct?
    {
        std::cerr << "wiringPiI2CSetup(int) == -1\n";
        return 1;
    }
    while(true)
    {
        wiringPiI2CWrite(0x23, 0x23);
        delay(100);
    }
}

从理论上讲,这应该会让阿迪诺人眨眼。然而,led仍然是黑暗的。

如果有人能解释我为什么这个程序不能工作,以及如何修复它,我会很感激。

是的,I2C在Raspi中被激活。

EN

回答 1

Stack Overflow用户

发布于 2016-09-06 18:12:48

Wire.onReceive()处理程序是从ISR处理程序调用的,因此所有其他ISR都被阻塞。包括正在计算的millis,没有它,delay()不能工作,因为它依赖于millis

例如,一些volatile变量应该由该事件更新并在loop()中处理,因为ISR处理程序必须尽可能短。

例如,如果接收到的字节LSB为1,则此值将发光。

代码语言:javascript
复制
#include <Wire.h>

volatile byte recv = 0;

void setup() {
  Wire.begin(0x23);               // join i2c bus with address #8
  Wire.onReceive(receiveEvent); // register event
  //Serial.begin(57600);          // start serial for output
  pinMode(13,OUTPUT);
}

void loop() {
  delay(10);
  digitalWrite(13, recv);
}

void receiveEvent(int howMany) {
  while (Wire.available()) { 
    byte c = Wire.read();
    recv = c & 1; // just last character and its LSB will be used
  }
}

另一方面是另一个arduino (因为我没有RPi)发送递增字节序列。每500毫秒一次。这使得第一次arduino眨眼:

代码语言:javascript
复制
#include <Wire.h>

void setup() {
  Serial.begin(57600);
  Wire.begin(); // join i2c bus (address optional for master)
}

byte x = 0;

void loop() {
  Wire.beginTransmission(0x23); // transmit to device #8
  Wire.write(x);              // sends one byte
  byte error = Wire.endTransmission();     // stop transmitting

  Serial.print("Sent: ");
  Serial.print(x,DEC);
  Serial.print(" ");
  Serial.println(error, DEC);

  x++;
  delay(500);
}

但基本上只有0或1的值可以发送关闭或打开led。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39354004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档