超过32字节限制python smbus

ktca8awb  于 2023-01-14  发布在  Python
关注(0)|答案(1)|浏览(207)

我试着从一个raspberry pi 3中读取50字节的数据。当使用SMBus时,一个块的长度只有32字节。Python有一个叫做smbus2的库,它提供了smbus访问。这个库还提供了一种方法,可以使用我正在使用的i2c_rdwr读取超过32字节限制的数据。但是,不是获得这50字节,我只接收到32个字节,字节33 - 49用0xFF填充。
该守则

from smbus2 import SMBus, i2c_msg

bus = SMBus(1)
read = i2c_msg.read(addr, 50)
bus.i2c_rdwr(read)
res = list(read)

print(''.join([chr(i) for i in res]))

它给出:

[some text 32 char long]+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
wbrvyc0a

wbrvyc0a1#

如果有人发现了这一点,我们不能在一次传输中发送超过32字节的数据,我们可以拆分数据,发送少于32字节的数据,或者循环字符串并发送每个字节。

// onReceiveEvent, doesn't work
void sendMessage()
{
    Wire.write(data, LENGTH); // data length is 50 byte
                              // this however, work if LENGTH < 32
}

// onReceiveEvent, work
void sendMessage()
{
    for (int i = 0; i < LENGTH; i++)
    {
        Wire.write(data[i]);
    }
}

// reason: in file twi.c:332
/* 
 * Function twi_transmit
 * Desc     fills slave tx buffer with data
 *          must be called in slave tx event callback
 * Input    data: pointer to byte array
 *          length: number of bytes in array
 * Output   1 length too long for buffer
 *          2 not slave transmitter
 *          0 ok
 */
uint8_t twi_transmit(const uint8_t* data, uint8_t length)
{
  uint8_t i;

  // ensure data will fit into buffer
  if(TWI_BUFFER_LENGTH < (twi_txBufferLength+length)){
    return 1;
  }

  ...

  twi_txBufferLength += length;
  
  return 0;
}

我仍然可以使用相同的python脚本,只是arduino不能在一次传输中发送超过32个字节。

相关问题