Python

时间:2018-01-21 18:21:04

标签: python arduino xbee

我需要从我的Python程序以特定格式发送数据。我的目标是可以将我的PC上的数据发送到连接到Arduino的XBee。这是通过一个程序(在Arduino上运行)完成的,但不是Python(Python代码通常是接收器)。

// allocate two bytes for to hold a 10-bit analog reading
uint8_t payload[7];
int value1 = 100; // data to be sent

payload[0] = value1 >> 8 & 0xff; // payload[0] = MSB.
payload[1] = value1 & 0xff; // 0xff = 1111 1111, i.e. 

最后使用此命令发送数据(使用XBee库):

Tx16Request tx_5001 = Tx16Request(0x5001, payload, sizeof(payload));
xbee.send(tx_5001);

在Python中,使用XBee Python库,我想发送这些数据,但它应该符合这种格式,这样我就可以使用现有的代码来读取数据并将其转换为有用的值。

总之,有没有人知道Python中以下代码的等价物?

uint8_t payload[7];
int value1 = 100; // data to be sent

payload[0] = value1 >> 8 & 0xff; // payload[0] = MSB.
payload[1] = value1 & 0xff; // 0xff = 1111 1111, i.e. 

在接收方,我有以下内容来提取可以使用的值:

uint8_t dataHigh = rx.getData(0);
uint8_t dataLow = rx.getData(1);
int value1 = dataLow + (dataHigh * 256);

编辑:我的数据确实不需要两个字节,所以我通过在python data = chr(0x5A)中定义一个字节并在我的发送中使用它来进行测试,并在接收到的时使用了int value1 =无论我定义什么数据,analogHigh返回232!

2 个答案:

答案 0 :(得分:1)

你可能正在寻找struct(将python int转换为unit8_t)我用它来与低级别设备进行通信。

所以

import struct
var = 25  # try 2**17 and see what happens
print(struct.pack('<H', var))  # b'\x00\x19'
print(struct.pack('>H', var))  # b'\x00\x19'
  • 正如您在Little和Big Endian之间看到的><更改字节一样。
  • H简称(uint16_t),B用于unsigned char(uint8_t)。

b''是python bytes字符串,允许您查看字节数据。 所以我建议你从xbee.send(b'\x45\x15')开始,看看另一方面会发生什么。如果通信工作,则开始创建将python类型转换为结构重复的函数。

另见:  BitwiseOperators

答案 1 :(得分:-1)

有不同的方法可以解决这个问题,一种方法是进行for循环

for (int i = 0; i < rx.getDataLength(); i++)
{
  Serial.print( rx.getData(i), HEX );
}

并从该字符串中提取数据,其中有很多方法可以执行此操作。