如何通过i2c发送数组?

时间:2014-08-29 11:54:29

标签: python arrays arduino raspberry-pi i2c

我已经尝试了好几天来发送i2c的python数组。

data = [x,x,x,x] # `x` is a number from 0 to 127.
bus.write_i2c_block_data(i2c_address, 0, data)

bus.write_i2c_block_data(addr, cmd, array) 

在上面的函数中:addr - arduino i2c adress; cmd - 不确定这是什么; array - int数字的python数组。
这可以吗?什么是cmd?


FWIW,Arduino代码,我收到数组并将其放在byteArray上:

void receiveData(int numByte){
    int i = 0;
    while(wire.available()){
        if(i < 4){
            byteArray[i] = wire.read();
            i++;
        }
     }
  }

它给了我这个错误:
bus.write_i2c_block_data(i2c_adress, 0, decodedArray) IOError: [Errno 5] Input/output error.我尝试了这个:bus.write_byte(i2c_address, value),它有效,但只适用于从0开始的value到127,但是,我不仅要传递一个值,还要传递一个完整的数组。

3 个答案:

答案 0 :(得分:3)

功能很好。

但你应该注意一些问题:

  • bus.write_i2c_block_data(addr,cmd,[])发送cmd的值和I2C总线列表中的值。

所以

bus.write_i2c_block_data(0x20, 42, [12, 23, 34, 45])

不向设备发送4个字节但只发送5个字节。

我不知道线程库如何在arduino上工作,但设备只读取4个字节,它不会发送最后一个字节的ACK,并且发送方检测到输出错误。

  • I2C设备地址存在两种约定。 I2C总线有7位用于器件地址,有一位用于指示读或写。另一个(错误的)约定是以8位写入地址,并说你有一个读取地址,另一个用于写入。 smbus包使用正确的约定(7位)。

例程:7位约定的0x23,写入时为0x46,读取时为0x47。

答案 1 :(得分:0)

我花了一段时间,但我得到了它的工作。

在arduino方面:

int count = 0;
...

...
void receiveData(int numByte){

    while(Wire.available()){
      if(count < 4){
        byteArray[count] = Wire.read();
        count++;
      }
      else{
        count = 0;
        byteArray[count] = Wire.read();
      }
    }
}  

在树莓方面:

def writeData(arrayValue):

    for i in arrayValue:
        bus.write_byte(i2c_address, i)

就是这样。

答案 2 :(得分:0)

cmd是要在其上写入数据的偏移量。 所以就像

bus.write_byte(i2c_address, offset, byte)

但是,如果要写入字节数组,则需要写入块数据,以便代码看起来像这样

bus.write_i2c_block_data(i2c_address, offset, [array_of_bytes])