我需要一次从Raspberry Pi向Arduino发送4个整数。目前Arduino没有请求或发送数据,但可能需要稍后。我的代码有点工作,但在发送了大约5个数组后它崩溃了。
Raspberry Pi Code(Python)
import smbus
import time
bus = smbus.SMBus(1)
address = 0x04
def writeNumber(a,b,c,d):
bus.write_i2c_block_data(address, a, [b, c, d])
return -1
while True:
try:
writeNumber(12,42,-5,0)
time.sleep(1) #delay one second
except KeyboardInterrupt:
quit()
Arduino代码
#include <Wire.h>
int data [4];
int x = 0;
void setup() {
Serial.begin(9600);
Wire.begin(0x04);
Wire.onReceive(receiveData); //callback for i2c. Jump to void recieveData() function when pi sends data
}
void loop () {
delay(100); //Delay 0.1 seconds. Something for the arduino to do when it is not inside the reciveData() function. This also might be to prevent data collisions.
}
void receiveData(int byteCount) {
while(Wire.available()) { //Wire.available() returns the number of bytes available for retrieval with Wire.read(). Or it returns TRUE for values >0.
data[x]=Wire.read();
x++;
}
}
Serial.println("----");
Serial.print(data[0]);
Serial.print("\t");
Serial.print(data[1]);
Serial.print("\t");
Serial.print(data[2]);
Serial.print("\t");
Serial.println(data[3]);
Serial.print("----");
}
它将适用于大约5个阵列,即它将发送a,b,c,d
,然后一秒钟之后它将再次发送它,然后一秒钟后再发送5次,然后它崩溃并且LXTerminal产生错误:
Traceback (most recent call last):
File "PS3_ctrl_v2.py", line 44, in <module>
writeNumber(12,42,-5,0)
File "PS3_ctrl_v2.py", line 11, in writeNumber
bus.write_i2c_block_data(address, a, [b, c, d])
IOError: [Errno 5] Input/output error
我做错了什么,如何让我的代码更健壮?