如何通过 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)
对于我的 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)