Raspberry PI 如何从 Arduino 接收结构?
How can a Raspberry PI receives a struct from Arduino?
几天来我一直在努力寻找解决这个问题的方法,但到目前为止没有任何效果。不得不说 Python 不是我的强项。
无论如何,我正在尝试使用我用 Radiohead
库编程的 LoRa t运行sceiver(RFM95) 发送一个 typedef struct
。结构如下所示:
typedef struct {
double temp;
double hum;
} Payload;
我能够在树莓派端接收数据,但就像一个字节数组。
Received: [0, 0, 228, 65, 154, 153, 65, 66]
如何将其转换为 {temp: VALUE_OF_TEMP, hum: VALUE_OF_HUM}
之类的对象?
有没有办法像在 C 中那样做?
示例:
typedef struct {
double temp;
double hum;
} ReceivedData;
ReceivedData data;
data = *(Payload*)receivedBuffer;
请帮忙!我运行没主意了!
使用 struct 模块很容易做到这一点:
在你的例子中,你正在解码两个双打,所以格式是 dd
。
from struct import unpack
def parse_payload(data_buffer):
as_tuple = unpack('dd', data_buffer)
return {
"temp": as_tuple[0],
"hum": as_tuple[1]
}
显然,您仍然应该事先进行一些验证和健全性检查,并且您可能必须处理字节顺序问题,但这应该足以让您继续前进。
尝试使用
#pragma pack(推,1)
结构。 . .
#pragma pack(pop)
为了防止字节排列
你没有提到你使用的是哪种 Arduino,我假设你使用的是 Arduino Uno 或带有 8 位 MCU 的东西。对于带有 8 位 MCU 的 Arduino,double
就像 float
由 4 个字节组成,而不是 32 位 MCU 中的 8 个字节或 Raspberry Pi.
所以要使用 Python 在 RPI 上解压结构,我想这就是您要找的:
import struct
data = [0, 0, 228, 65, 154, 153, 65, 66]
bstr = bytearray(data)
result = struct.unpack("<ff", bstr)
print(result)
这将产生如下结果:
(28.5, 48.400001525878906)
我认为这是您通过 Arduino 发送的两个值。
更新
如果您正在接收由多个数据结构组成的数据,您可以使用iter_unpack()
方法:
import struct
data = [0, 0, 228, 65, 154, 153, 65, 66, 0, 0, 228, 65, 154, 153, 65, 66, 0, 0, 228, 65, 154, 153, 65, 66]
bstr = bytearray(data)
results = struct.iter_unpack("<ff", bstr)
for result in results:
print(result)
我建议您更详细地阅读 Python struct 的文档,以充分利用该库。
几天来我一直在努力寻找解决这个问题的方法,但到目前为止没有任何效果。不得不说 Python 不是我的强项。
无论如何,我正在尝试使用我用 Radiohead
库编程的 LoRa t运行sceiver(RFM95) 发送一个 typedef struct
。结构如下所示:
typedef struct {
double temp;
double hum;
} Payload;
我能够在树莓派端接收数据,但就像一个字节数组。
Received: [0, 0, 228, 65, 154, 153, 65, 66]
如何将其转换为 {temp: VALUE_OF_TEMP, hum: VALUE_OF_HUM}
之类的对象?
有没有办法像在 C 中那样做? 示例:
typedef struct {
double temp;
double hum;
} ReceivedData;
ReceivedData data;
data = *(Payload*)receivedBuffer;
请帮忙!我运行没主意了!
使用 struct 模块很容易做到这一点:
在你的例子中,你正在解码两个双打,所以格式是 dd
。
from struct import unpack
def parse_payload(data_buffer):
as_tuple = unpack('dd', data_buffer)
return {
"temp": as_tuple[0],
"hum": as_tuple[1]
}
显然,您仍然应该事先进行一些验证和健全性检查,并且您可能必须处理字节顺序问题,但这应该足以让您继续前进。
尝试使用 #pragma pack(推,1) 结构。 . . #pragma pack(pop)
为了防止字节排列
你没有提到你使用的是哪种 Arduino,我假设你使用的是 Arduino Uno 或带有 8 位 MCU 的东西。对于带有 8 位 MCU 的 Arduino,double
就像 float
由 4 个字节组成,而不是 32 位 MCU 中的 8 个字节或 Raspberry Pi.
所以要使用 Python 在 RPI 上解压结构,我想这就是您要找的:
import struct
data = [0, 0, 228, 65, 154, 153, 65, 66]
bstr = bytearray(data)
result = struct.unpack("<ff", bstr)
print(result)
这将产生如下结果:
(28.5, 48.400001525878906)
我认为这是您通过 Arduino 发送的两个值。
更新
如果您正在接收由多个数据结构组成的数据,您可以使用iter_unpack()
方法:
import struct
data = [0, 0, 228, 65, 154, 153, 65, 66, 0, 0, 228, 65, 154, 153, 65, 66, 0, 0, 228, 65, 154, 153, 65, 66]
bstr = bytearray(data)
results = struct.iter_unpack("<ff", bstr)
for result in results:
print(result)
我建议您更详细地阅读 Python struct 的文档,以充分利用该库。