单片机数据接收编码问题,请高手指点迷津

pkugnss 2012-06-28 10:43:44
有一块机子,不知道怎么接收解析它的数据,望请高手帮助
输出二进制数据,其中:
1、每个数据的低字节在前,高字节在后。
2、双精度数结构(64 bits)
MSB (bit 63) = Sign
Bit 62-52 = Exponent (exp)
Bit 51-00 = Mantissa= 2exp(-1)*bit51 + 2 exp(-2)*bit50...
Value = Sign * 1.mantissa * 2 exp(EXP-1023)
数据中,由先至后的顺序为:Bit 7 - 0, Bit 15 - 8, Bit 23 - 16, Bit 31 - 24, Bit 39 - 32, Bit 47 - 40, Bit 55 - 48, Bit 63 – 54

没搞懂应该怎么解析这些数据
C#语言
小弱跪求指导。。
...全文
169 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
pkugnss 2012-07-04
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 9 楼 的回复:

引用 3 楼 的回复:

忘了一件事,这个exp有可能是负数
如果是的话就应该是
for(;exp!=0;exp++)ret/=2;

多谢大侠帮助,虽然你写的C++代码我不怎么认识。。

C#下应该可以用,你把uint32_t,uint16_t改成对应的名字,&,>>,<<这些操作符C#应该认识
[/Quote]
多谢大侠的指导!
ymm198606 2012-06-30
  • 打赏
  • 举报
回复
有解析的话,肯定有编码内容的;找下具体的编解码的协议,对照解析即可;关键是调试过程
dceacho 2012-06-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 3 楼 的回复:

忘了一件事,这个exp有可能是负数
如果是的话就应该是
for(;exp!=0;exp++)ret/=2;

多谢大侠帮助,虽然你写的C++代码我不怎么认识。。
[/Quote]
C#下应该可以用,你把uint32_t,uint16_t改成对应的名字,&,>>,<<这些操作符C#应该认识
dceacho 2012-06-29
  • 打赏
  • 举报
回复
忘了一件事,这个exp有可能是负数
如果是的话就应该是
for(;exp!=0;exp++)ret/=2;
诶呦 2012-06-29
  • 打赏
  • 举报
回复
1、每个数据的低字节在前,高字节在后。
2、双精度数结构(64 bits)
MSB (bit 63) = Sign
Bit 62-52 = Exponent (exp)
Bit 51-00 = Mantissa= 2exp(-1)*bit51 + 2 exp(-2)*bit50...
Value = Sign * 1.mantissa * 2 exp(EXP-1023)
数据中,由先至后的顺序为:Bit 7 - 0, Bit 15 - 8, Bit 23 - 16, Bit 31 - 24, Bit 39 - 32, Bit 47 - 40, Bit 55 - 48, Bit 63 – 54
==========================================================================
这个不就是解析数据的过程么?
AnYidan 2012-06-29
  • 打赏
  • 举报
回复
看协议,如果没有相当有解密
pkugnss 2012-06-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

忘了一件事,这个exp有可能是负数
如果是的话就应该是
for(;exp!=0;exp++)ret/=2;
[/Quote]
多谢大侠帮助,虽然你写的C++代码我不怎么认识。。
pkugnss 2012-06-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

1、每个数据的低字节在前,高字节在后。
2、双精度数结构(64 bits)
MSB (bit 63) = Sign
Bit 62-52 = Exponent (exp)
Bit 51-00 = Mantissa= 2exp(-1)*bit51 + 2 exp(-2)*bit50...
Value = Sign * 1.mantissa * 2 exp(EXP-1023)
数据中,由先……
[/Quote]
我知道是数据解析,但是不知道应该怎么解析呀,小弱以前没做过。。求指导
zynh1020 2012-06-29
  • 打赏
  • 举报
回复
看下协议,看下数据内容
dceacho 2012-06-28
  • 打赏
  • 举报
回复
大端数据
看这结构像是浮点数或double,如果是的话直接强制转换就行了

假设你最终接收到的数是uint64_t dat;
[code=C/C++]
double decode(uint64_t dat)
{
double ret;
uint16_t exp;
exp=(dat&0x7ff0 0000 0000 0000)>>52;//得到EXP
ret=(double)(dat&0x000f ffff ffff ffff);//得到mantissa
if(dat&0x8000 0000 0000 0000==0x8000 0000 0000 0000)//得到sign
{
ret=-ret;
}
for(;exp!=0;exp--)ret*=2;
return ret;
}
[/CODE]

你找些数据验证下
pkugnss 2012-06-28
  • 打赏
  • 举报
回复
顶个,求路过帮助~~~

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧