2013-04-18 213 views
2

我在python中有一个程序,其中我想用一些值接收一个帧。这个值由xbee发送。将字符中的浮点数转换为浮点数(PYTHON)

的XBee发送由工会结构中的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逐个读取字节。

有什么想法?

+3

目前尚不清楚是什么给你带来麻烦。如果你读了四个字节并把它们放到一个字符串's'中,那么你可以用'struct.unpack('4b',s)'将它们转换成'(10,-41,-119,65)', 'struct.unpack('f',s)[0]'(['0]''是必要的,因为你会得到一个元素的元组,而不是一个浮点数。)这是否有帮助? – DSM

+0

但是,如何在字符串中设置字节?我试过:s = [10,-41,-119,65] print struct.unpack('f',s)[0] 但它告诉我它需要长度为4的字符串参数...我怎么读4个字节并将它们保存在一个字符串数组中? – Biribu

+3

我以为你总是把浮子装进字符中,并想把这些字符变成浮子?无论如何,如果你有一个数字列表,你可以使用'struct.pack'将它们打包成一个字符串:try'n = [10,-41,-119,65]'然后'struct.pack('4b' ,* n)'得到一个四字节的字符串。我认为你应该编辑你的问题,使之更清楚你现在拥有什么以及你想要结束什么。 – DSM

回答

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 
+0

我不知道可以同时读取多于一个字节。我会试试这个。 – Biribu

+0

谢谢,现在我明白了! – Biribu

+0

我发现我有一个直接读取4个值的问题。由于我的xbee使用AP = 2,他们已经逃脱了角色。所以也许有时候接收的字符并不代表真正的值,甚至不能代表在它之前插入的转义字符......所以我想我必须检查读取的每个字节,然后将它放在struct上......我可以只提取一个字节字节插入该结构中检查它?这样,我可以阅读4,检查他们,并知道他们之一是否是错误的修改它,并阅读另一个... – Biribu

相关问题