2

我在 python 中有一个程序,我想在其中接收带有一些值的帧。该值由 xbee 发送。

Xbee 发送一个由联合结构分成 4 个字节的浮点数,如下所示:

typedef union _data{
    float f;
    char s[4];
} myFloat;

例如,17.23 给我 10、-41、-119、65。所以,我必须在 python 中恢复所有这些值,在我得到 4 之后,将它们转换为浮点数。自从我阅读了每一个 (serial.read()) 以获得浮点结果后,我该怎么办?

这些值将由 python 脚本接收,我想再次将它们加入浮点数。我在 python 中阅读了 struct ,但我对 python 的技能不好,我不明白它是如何工作的。

我使用serial.read逐个读取字节。

任何想法?

4

1 回答 1

6

如果我理解正确,您将获得四个整数[10, -41, -119, 65],并且您想将它们重新组合成原始浮点数。如果是这样,答案已经包含在@DSM 的评论中。将这些位拼凑在一起:

>>> import struct
>>> x = [10, -41, -119, 65]
>>> struct.unpack('<f', struct.pack('4b', *x))[0]
17.229999542236328

请注意,我们并没有准确地 17.23到达这里,因为该数字不能完全表示为单精度 IEEE 754 二进制浮点数。

不过,这听起来有点颠倒:获取原始字节应该比获取 4 个整数更容易。你究竟是如何获得整数值的?如果您使用的是 pyserial,难道您不能read(4)一次获取 4 个字节,然后struct.unpack直接使用结果吗?例如,我希望这样的东西可以工作(模拟口译会话):

>>> import struct
>>> x_bytes = ser.read(4)  # (where ser is your Serial instance)
>>> x = struct.unpack('<f', x_bytes)[0]
>>> x
17.229999542236328
于 2013-04-18T19:42:48.803 回答