python — отправляет целочисленный массив через I2C из Raspberry Pi в Arduino

Мне нужно отправить 4 целых числа одновременно от Raspberry Pi до Arduino. На данный момент 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 -1while True:
try:
writeNumber(12,42,-5,0)
time.sleep(1)                    #delay one second

except KeyboardInterrupt:
quit()

Arduino Code

#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

Решение

Просто измени адрес на что-то большее. Первые адреса зарезервированы (см. Эта статья). Я использовал твой код с адресом 0x20 и работает нормально.

1

Другие решения


По вопросам рекламы [email protected]