我目前在使用Arduino和Raspberry Pi 2时遇到了一些问题。
我在Arduino和Pi之间建立了一个工作I²C连接。我将Arduino配置为奴隶。
一些简单的测试有效。但是当我继续使用Arduino大约5分钟(实际时间是随机的)而不是I²C时,我在Wire.onReceive
注册的函数停止被调用。 Arduino会根据请求继续发送值,但似乎完全忽略了发送给它的任何数据。
到目前为止我测试的内容:
以下是Arduino上的代码:
#include <Wire.h>
const byte ADDRESS = 0x4E;
const byte FLAG_PWM = 0x80;
byte states[22] = {OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT, OUTPUT};
byte request;
void setup() {
Wire.begin(ADDRESS);
Wire.onReceive(receiveEvent);
Wire.onRequest(requestEvent);
}
void loop() {
delay(100);
}
// At some point this function isn't called anymore. (request doesn't change)
void receiveEvent(int howMany) {
byte byteIN = Wire.read();
boolean pwm = byteIN & FLAG_PWM;
byteIN &= ~FLAG_PWM;
if (byteIN > 21)
return;
if (howMany == 1) {
request = byteIN;
if (states[byteIN] != INPUT)
pinMode(byteIN, INPUT);
} else if (howMany == 2) {
if (states[byteIN] != OUTPUT)
pinMode(byteIN, OUTPUT);
byte value = Wire.read();
// Disabling this does not help
if (pwm)
analogWrite(byteIN, value);
else
digitalWrite(byteIN, value);
}
}
// This function keeps working after the other failed.
void requestEvent() {
if (request < A0) {
// Disabling this does not help
byte value = digitalRead(request);
Wire.write(&value, 1);
} else {
// Disabling this does not help
int value = analogRead(request);
Wire.write((char*)&value, 2);
}
}
现在我无法访问Pi上的代码。但如果需要,我可以在这里发布。
Pi要求每20分钟进行一次读取。
我的想法已经不合时宜了......
答案 0 :(得分:0)
我不是专家,但Wire中有一项功能可以检查是否有可读的内容:
String DecodeUri()
{
String ret = "";
while (1 < Wire.available())
{
ret += (char)Wire.read();
}
ret += (char)Wire.read();
return ret;
}
除此之外,您可以查看许多人如何查看是否可以阅读。
另一个奇怪的事情是,如果我使用的电池电量不是很大,那么I2C会很奇怪。