(抱歉英语不好,我是德国人)
你好,程序员,
我正在尝试(没有成功)将数据从Raspberry Pi 3(主)发送到Arduino(奴隶):
下面是我的更新的 Arduino代码:
#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):
#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中被激活。
发布于 2016-09-06 18:12:48
Wire.onReceive()处理程序是从ISR处理程序调用的,因此所有其他ISR都被阻塞。包括正在计算的millis,没有它,delay()不能工作,因为它依赖于millis。
例如,一些volatile变量应该由该事件更新并在loop()中处理,因为ISR处理程序必须尽可能短。
例如,如果接收到的字节LSB为1,则此值将发光。
#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眨眼:
#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。
https://stackoverflow.com/questions/39354004
复制相似问题