title: Send Integer Array via I2C from Raspberry Pi to Arduino
body: <p>I need to send 4 integers at a time from the Raspberry Pi to the Arduino. At the moment the Arduino doesn't request or send data, but it might need to later. My code sort of works but it crashes after about 5 arrays have been sent.</p>
  
  <p>Raspberry Pi Code (Python)</p>
  
  <pre><code>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()
  </code></pre>
  
  <p>Arduino Code</p>
  
  <pre><code>#include &lt;Wire.h&gt;
  
  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 &gt;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("----");
  
  }
  </code></pre>
  
  <p>It will work for about 5 arrays, i.e it will send <code>a,b,c,d</code>, then one second later it will send it again, then a second later again, for 5 times, and then it crashes and the LXTerminal produces the error:</p>
  
  <pre><code>Traceback (most recent call last):
  File "PS3_ctrl_v2.py", line 44, in &lt;module&gt;
  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 
  </code></pre>
  
  <p>What am I doing wrong and how can I make my code more robust?</p>