2013-04-18 308 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

相關問題