Skip to main content
 首页 » 编程设计

python之数据传输错误 I2C RasPi->Arduino

2025年05月04日30dudu

我正在修补我的 RaspberryPi 和我的 Arduino 以通过 I2C 发送一些文本。到目前为止我已经开始工作了,但是出现了一个不应该存在的数字。

我正在发送“Hello”,将其转换为 int 数组并通过 I2C 发送。

['H','e','l','l','o'] => [72,97,108,108,111] // This should be the result 
['H','e','l','l','o'] => [0, 5, 72, 101, 108, 108, 111] // This is what i get 

前导 0 是故意的,但 5 根本不应该存在!

我在 Arduino 上运行的(缩短的)代码:

void setup() { 
  Serial.begin(9600); // start serial for output 
  // initialize i2c as slave 
  Wire.begin(SLAVE_ADDRESS); 
 
  // define callbacks for i2c communication 
  Wire.onReceive(receiveData);   
  Serial.println("Ready!"); 
} 
 
receiveData(int byteCount) { 
    int i; 
 
    // Iterate through the byte packets 
    for(i = 0; Wire.available(); i++) {  
        number = Wire.read(); 
 
        if(i != 0) {  // Ignore the first byte 
            text[i-1] = (char)number; 
        } 
 
        // Output number, byteCount, and i over the serial bus 
    } 
 
    Serial.print("Result: "); 
    Serial.println(text); 
} 

我得到的确切输出:

[CMD]data received: 0, 2char: , byteCount: 7, Iteration: 0 //The cmd byte 
data received: 5, 2char: , byteCount: 7, Iteration: 1 
data received: 72, 2char: H, byteCount: 7, Iteration: 2 
data received: 101, 2char: e, byteCount: 7, Iteration: 3 
data received: 108, 2char: l, byteCount: 7, Iteration: 4 
data received: 108, 2char: l, byteCount: 7, Iteration: 5 
data received: 111, 2char: o, byteCount: 7, Iteration: 6 
Result: "Hello" 

在树莓派上运行的代码(Python):

import smbus 
import time 
 
# Initiate the SMBus on device 1 
bus = smbus.SMBus(1) 
 
# The address of the Arduino 
address = 0x04 
 
chars = [] # The character/int array 
test = "Hello" # The test text 
 
# Split up the string in individual chars,  
# convert them to int and add them to the array 
for c in test: 
    chars.append(ord(c)) 
 
# send the data... the 0 is the cmd byte! The function accepts an int array 
bus.write_block_data(address, 0, chars)  

请您参考如下方法:

仅从显示的值来看,很可能是传输的字符串部分中发送的字符数或字节数。 “Hello”在 ASCII 表示中有 5 个字节。

如果您查看 smbus protocol 的描述在 write_block_data 命令的部分中,它记录了在给出数据 block 长度的命令字节之后发送一个 8 位计数。

SMBus Block Write: i2c_smbus_write_block_data()

The opposite of the Block Read command, this writes up to 32 bytes to a device, to a designated register that is specified through the Comm byte. The amount of data is specified in the Count byte.

S Addr Wr [A] Comm [A] Count [A] Data [A] Data [A] ... [A] Data [A] P