【发布时间】: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 我设法使用我声明的
union在float变量(Val)中复制了我想要的内容。我得到了我想要的位 (ACC52737),但是 C 程序将此浮点数解释为-5.60343e-12,而我应该得到1.00e-5。同一个浮点数的不同解释??? -
这已解决。结果 matlab 中的
typecast()函数为您提供了single表示的各个字节,但是您在位置 1 中获得 LSB,在位置 4 中获得 MSB ... WHYY MATLAB WHYY??如果您不想处理类型转换,您也可以使用num2hex(),它将以正确的顺序给出single表示的十六进制值。