【问题标题】:How to copy separated bytes into a double variable?如何将分隔的字节复制到双变量中?
【发布时间】:2013-11-14 19:15:16
【问题描述】:

我正在使用 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 的位标记为双精度值?

谢谢!

【问题讨论】:

  • 字节排序问题?两个系统使用float的不同编码?
  • double 类型需要 64 位而不是 32 位。您可能需要使用 float。为什么要转换为十六进制字符串?发送四个字节还不够?
  • OKEI 我设法使用我声明的unionfloat 变量(Val)中复制了我想要的内容。我得到了我想要的位 (ACC52737),但是 C 程序将此浮点数解释为 -5.60343e-12,而我应该得到 1.00e-5。同一个浮点数的不同解释???
  • 这已解决。结果 matlab 中的 typecast() 函数为您提供了 single 表示的各个字节,但是您在位置 1 中获得 LSB,在位置 4 中获得 MSB ... WHYY MATLAB WHYY??如果您不想处理类型转换,您也可以使用num2hex(),它将以正确的顺序给出single 表示的十六进制值。

标签: c matlab double


【解决方案1】:

这是你想要的吗?

>> 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

【讨论】:

    【解决方案2】:

    问题是您将字节转换为字符串。您需要做的是将它们连接回 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');
    

    【讨论】:

    • 重新转换需要在 C 代码中进行,在 32 位平台上,例如 texas Instruments 的 F28335。这是我连续接收它的地方。
    • 而不是像你一样发送字符串,而是从我的脚本中发送 4 字节长的“numBitsConcat”,并将其转换为在 C 中浮动。
    • 我明白你的意思,但我只创建了一个字符串,所以我可以连接所有要发送的数据,然后我单独发送字节,fwriteconverting 首先将要发送的字符串字节转换为 dec hex2dec 我现在就试试你的建议:D
    猜你喜欢
    • 2019-06-30
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    相关资源
    最近更新 更多