1

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

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

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

Time1On = typecast(Time1On, 'uint8');

结果是:

172  197   39   55

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

ACC52737

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

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

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

但我明白了:

11100000000000000000000000000000 or 2.898602e+09

我尝试将其存储为联合:

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

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

有人曾经将双打分成字节并串行发送吗?如果是,您后来是如何组成和恢复相应的双数的?有没有办法将 unsigned int 的位戳成双精度值?

谢谢!

4

2 回答 2

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
于 2013-11-14T10:32:30.107 回答
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');
于 2013-11-14T10:43:30.273 回答