2015-05-01 105 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

相关问题