这里发布的是我的RPi master和Arduino slave项目的代码。我有一个连接到Arduino的模拟传感器,我正在使用RPi上的Processing读取这些数据。我正在使用Processing,因为我打算用数据生成图形和波形。下面的代码似乎有效,但是,设置的任何轻微移动都会断开"从设备,因为我收到以下消息。 "设备没有响应。检查电缆连接以及是否使用了正确的地址。"我已经缩小了问题,发现它总是在i2c.read();
函数断开连接。我的问题是是否存在某种类型的中断函数,以便在发生这种情况时,处理继续进行并在下一次迭代中再次尝试?或者,如果它被卡在一个循环中,它是否在等待来自从设备的某些信号?有没有人对如何处理这个有任何建议?
处理代码
import processing.io.*;
I2C i2c;
int val = 0;
void setup()
{
i2c = new I2C(I2C.list()[0]);
}
void draw ()
{
if (I2C.list() != null)
{
i2c.beginTransmission(0x04);
i2c.write(8);
byte[] in = i2c.read(1);
int accel = in[0];
println (accel);
}
}
Arduino代码
#include <Wire.h>
#define SLAVE_ADDRESS 0x04
int number = 5;
int state = 0;
const int zInput = A0;
int zRawMin = 493;
int zRawMax = 530;
float acceleration;
int accel;
void setup() {
analogReference(EXTERNAL);
pinMode(13,OUTPUT);
Serial.begin(9600); // start serial for output
Wire.begin(SLAVE_ADDRESS); // join i2c bus with address #8
Wire.onReceive(receiveData); // register event
Wire.onRequest(sendData);
Serial.println ("Ready");
}
void loop() {
int zRaw = ReadAxis (zInput);
acceleration = map (float(zRaw), float (zRawMin), float(zRawMax), -9.81, 9.81);
accel = int(acceleration);
//delay(100);
}
void receiveData(int byteCount)
{
while (0 < Wire.available())
{ // loop through all but the last
number = Wire.read(); // receive byte as a character
//Serial.print("data received");
Serial.println(number); // print the character
if (number==1)
{
if (state == 0)
{
digitalWrite(13,HIGH);
state = 1;
}
else
{
digitalWrite(13,LOW);
state = 0;
}
}
}
}
void sendData()
{
Wire.write(accel);
}
int ReadAxis(int axisPin)
{
long reading = 0;
int raw = analogRead(axisPin);
return raw;
}
答案 0 :(得分:0)
看起来解决方案可能是使用@Kevin Workman提供的try / catch块。它适用于我需要它做的事情。
这是更新的处理代码。
import processing.io.*;
I2C i2c;
int val = 0;
void setup()
{
i2c = new I2C(I2C.list()[0]);
}
void draw ()
{
if (I2C.list() != null)
{
i2c.beginTransmission(0x04);
i2c.write(8);
try
{
byte[] in = i2c.read(1);
}
catch(Exception e)
{
i2c.endTransmission();
}
int accel = in[0];
println (accel);
}
}