如何通过 i2c 将 Arduino 结构传递给 Raspberry Pi?

How to pass Arduino struct to Raspberry Pi via i2c?

对于我的 Arduino,我有一个结构:

int temp;

struct dataStruct {
   int Data;          
   int Data2;
   int Data3;
   int Data4;
   int Data5;
} my; 

void setup() {
    Wire.begin(SLAVE_ADDRESS);
    Wire.onReceive(receiveData);
    Wire.onRequest(sendData);
}

void loop(){
    delay(1000)
}

void receiveData(){
    while(Wire.available){
        temp = Wire.read();
    }
}

void sendData(){
    Wire.write((byte *)&my, sizeof(my));
}

我想通过 Wire.write 函数通过 i2c 将结构传递给我的 Raspberry Pi。我意识到只需尝试 Wire.write(my);不会工作所以我想知道是否有办法可以做到这一点?也许我需要完全尝试另一种方法?只要能把struct传到Raspberry Pi.

我愿意尝试其他方式

这也是我的 Python 代码:

import socket
import os
import random
import time
import smbus
import struct
bus = smbus.SMBus(1)
address = 0x04

temp = bytes([0x00, 0x00, 0x00, 0x00, 0x00])
the_struct = [0, 0, 0, 0, 0]

def writeNumber(value):
    bus.write_byte(address, value)
    return -1

def readNumber():
    number = bus.read_byte(address)
    return number

while True:
    temp = readNumber()
    the_struct = struct.unpack('5h', temp)
    print(the_struct)
    time.sleep(1)

您可以使用Wire.write((byte *)&my, sizeof(my))写入树莓派。要读取数据,您可以使用 struct 模块将结构解压缩到一个元组中,如下所示:

import struct

#assuming you've recved the struct over I2C into a bytes object named 'data'
the_struct = struct.unpack('5h', data)

the_struct 现在保存原始结构中的 5 个整数。

编辑

首先,0x04是保留地址之一。改用 0x15;从 0x08 开始的任何(几乎)都可以。

您正在读取一个字节,然后试图将该字节解压缩为 5 个整数。您应该改为读取 10 个字节,将它们一个一个地保存到 bytearray,然后如前所示解压缩它们。将您的 readNumber() 替换为:

def read_block(num_bytes):
    vals = bus.read_i2c_block_data(address, num_bytes)
    return vals

while True:
    temp = read_block(10)  # 10 is the number of bytes you want to read
    the_struct = struct.unpack('5h', temp)
    print(the_struct)
    time.sleep(1)