通过I2C从Raspberry Pi向Arduino发送整数数组

时间:2014-11-18 14:05:23

标签: python c++ arduino raspberry-pi i2c

我需要一次从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 

我做错了什么,如何让我的代码更健壮?

1 个答案:

答案 0 :(得分:1)

只需将地址更改为更大的内容即可。第一地址保留(请参见this article)。我将您的代码与地址0x20一起使用,效果很好。