Raspberry PI如何从Arduino接收结构?

2024-06-16 11:57:11 发布

您现在位置:Python中文网/ 问答频道 /正文

几天来,我一直在试图找到解决这个问题的办法,但到目前为止,一切都不管用。我必须提醒你,Python不是我的强项

无论如何,我正在尝试使用我用Radiohead库编程的LoRa收发器(RFM95)发送typedef struct。结构如下所示:

typedef struct {
    double temp;
    double hum;
} Payload;

我可以在raspberry端接收数据,但就像一个字节数组

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;

请帮忙!我的创意用完了


Tags: ofdatavalue编程tempstructpayloaddouble
3条回答

尝试使用 #pragma包(推送,1) 结构。 #布拉格语包(流行语)

用于防止字节排列

使用struct模块很容易做到这一点:

在本例中,您正在解码两个double,因此格式为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]
  }

显然,您仍然应该事先进行一些验证和健全性检查,并且您可能必须处理endianness问题,但这应该足以让您继续

你没有提到你使用的是什么类型的Arduino,我假设你使用的是Arduino Uno或是带有8位MCU的东西。对于带有8位MCU的Arduino来说,double就像float由4个字节组成,而不是32位MCU或Raspberry Pi中的8个字节

因此,要用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的文档,以充分利用该库

相关问题 更多 >