我正在使用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!
答案 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');