如何将分隔的字节复制到双变量中?

时间:2013-11-14 10:12:48

标签: c matlab double

我正在使用TI的F28335串行通信(RS-232)和PC。

在matlab中,我需要计算一些双数并将它们串行发送到控制器。

为此,例如,我有1.00e-5,并使用以下方法将其转换为单个字节:

Time1On = typecast(Time1On, 'uint8');

结果是:

172  197   39   55

然后我把它转换为十六进制,我设法把它变成一个字符串来发送它

ACC52737

我将它串行发送到F28335,我将正确的值输入Uint32变量(数组中的位置),但我似乎无法找到将相同的单个字节复制到double值的方法,这会得到相同的原始分数。

我尝试从Uint32数组进行转换,其中正确存储了接收的值:

dataDouble = (double) (*(RxPacket.RcvData + RxPacket.idxData));

但我明白了:

11100000000000000000000000000000 or 2.898602e+09

我尝试将其存储为联盟:

union doubleConstruct{
    double Val;
    Uint16 rxArray[2];
};

并单独保存16个字(我用汉明奇偶校验每16位编码,并将16位字解码)到数组的位置,但双重结果是相同的......

任何人都曾将双打打成字节并连续发送?如果是的话,你后来如何编写并恢复了相应的双号? 有没有办法将unsigned int的比特压缩为double?

THX!

2 个答案:

答案 0 :(得分:0)

这是你想要的吗?

>> bytes = [0  0  1 0  102];
>> bytes*(2.^(8*(length(bytes)-1:-1:0))).'

ans =

       65638

我正在考虑最有意义的字节在左边。否则使用bytes*(2.^(8*(0:length(bytes)-1))).'


如果您有十六进制字符串,请使用base2dec

>> hex = 'ACC52737'
>> base2dec(hex,16)

ans =

  2.8986e+009

或者,获取字节,

>> typecast(base2dec(hex,16), 'uint8')

ans =

    0    0  224  230  164  152  229   65

答案 1 :(得分:0)

问题是您将字节转换为字符串。你需要做的是将它们连接回32位数并将其转换回来:

num = 1e-5;
numBits = typecast(single(num ),'uint8');
numBitsConcat = (uint32(sum(uint32(numBits).*uint32(2.^(8*[0 1 2 3])))))
num_ =  typecast(numBitsConcat ,'single');