我已经尝试了好几天来发送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,但是,我不仅要传递一个值,还要传递一个完整的数组。
答案 0 :(得分:3)
功能很好。
但你应该注意一些问题:
所以
bus.write_i2c_block_data(0x20, 42, [12, 23, 34, 45])
不向设备发送4个字节但只发送5个字节。
我不知道线程库如何在arduino上工作,但设备只读取4个字节,它不会发送最后一个字节的ACK,并且发送方检测到输出错误。
例程: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])