我在python中有一个程序,我希望在其中接收带有一些值的框架。该值由xbee发送。
Xbee发送一个由union结构分成4个字节的浮点数,如下所示:
typedef union _data{
float f;
char s[4];
} myFloat;
所以例如,17.23给了我10,-41,-119,65。所以,我必须在python中恢复所有这些值,在我得到4之后,将它们转换成浮点数。自从我读取每个(serial.read())以得到浮点数后,我该怎么做?
这些值将由python脚本接收,我想再次将它们加入到float中。我在python中读到了关于struct的内容,但我在python中并不是很好,我不明白它是如何工作的。
我使用serial.read逐个读取字节。
有什么想法吗?
答案 0 :(得分: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