2015-05-01 106 views
1

我從串口讀取4個字節,我想創建一個Matlab 函數將它們轉換爲浮點數 例如:如果我讀了A = [65 240 0 0]我必須根據 IEEE754標準有30個。 - 我已經使用Simulink塊「字節解壓」,但我有問題。實際上 我應該讀取18個參數。每個參數是4個字節 array.then我應該使用18個字節解壓縮。轉換4個字節浮點數matlab

+1

你想創建一個函數,或者使用一個內建函數:['typecast'](http://mathworks.com/help/matlab/ref/typecast.html) – Hoki

+0

正如答案之一,您可能沒有正確使用字節解壓縮塊。它可能只是改變塊中的末端設置的問題。你不會說你如何使用和參數化該塊,也不知道你有什麼「問題」。 – am304

回答

4

默認情況下,Matlab將使用雙精度來存儲任何沒有指定類型的新值。如果您知道您正在閱讀byte,那麼最好是直接將它們收集爲uint8(Matlab的無符號字節類型),如果可以的話(在您撥打fread或同等電話時)。

如果您無法直接將它們作爲uint8收集,則將它們按原樣投射,然後使用typecast函數。

A = [65 240 0 0] ; %// Collected bytes 

A = uint8(A) ;      %// cast them to "uint8" if they are not already 
Afloat = typecast(A , 'single') ; %// cast the 4 bytes as a 32 bit float 

等一下:

Afloat = 
    8.6186862e-41 

哎呀,看來你的收集機制使用的字節順序是相反的是利用Matlab使用的一個。沒問題,你可以通過「翻轉」字節數組來改變字節順序。

所以取而代之,使用方法:

>> Afloat = typecast(fliplr(A) , 'single') 
Afloat = 
    30 

成功:)

您也可以看看功能swapbytes管理字節序。

+0

非常感謝你 –

+0

@SalimSaloumi。沒問題,樂意幫忙。如果我的答案或其他問題解決了您的問題,請考慮「接受」它(投票箭頭下方的綠色標記),以向未來的讀者展示您的問題已得到解決。 – Hoki

4

爲了避免重新發明輪子,只需使用

A = fread(obj,size,'precision') 

documentation

例如描述的,

[A,count] = fread(obj, 18, 'float32'); 

應改爲18間4字節浮動。

+0

取決於他如何接收數據以及從哪個設備接收數據並不總是可能的(某些設備發送字節1,並且在接收下一個設備之前必須先進行確認)。但是如果他確實可以用'fread'直接讀取4個字節,則應該提及最後一個參數'machineformat',它將指定字節順序。他似乎需要它;-) – Hoki

相關問題