21ic问答首页 - 51单片机数据处理问题
51单片机数据处理问题
爱电子的化学人2022-07-23
各位大佬们好,最近在学习modbus通信协议,废了老大劲终于把数据从传感器里面读出来了,但是卡在数据处理这一步了处理方法说明书上写的很详细,可是这部分代码实在是不会写,希望有大佬指点一二。
比如这个例子,读到的数据顺序为 66 66 42 7B,需要将其转为二进制后分成1位符号位、8位指数位和23位尾数,然后分别化为整数后再计算===========================================
步骤1:66 66 42 7B对应0x427B6666
将二进制数分成符号、指数和尾数
0 10000100 11110110110011001100110
1为符号+ 8位指数+ 23为尾数
S:0 二进制 = 0 (正符号)
E:10000100 二进制 = 1*27 + 0*26 + 0*25 + 0*24 + 0*23 + 1*22 + 0*21 + 0*20
= 128 + 0 + 0 + 0 + 0 + 4 + 0 + 0
= 132
M:11110110110011001100110 二进制 = 8087142
步骤2:计算十进制数
D = (-1)S * (1.0 + M/223) * 2E-127
= (-1)0 * (1.0 + 8087142/223) * 2132-127
= 1 * 1.964062452316284 * 32
= 62.85
===================================
如果有大佬愿意指点一下,小弟感激不尽
比如这个例子,读到的数据顺序为 66 66 42 7B,需要将其转为二进制后分成1位符号位、8位指数位和23位尾数,然后分别化为整数后再计算===========================================
步骤1:66 66 42 7B对应0x427B6666
将二进制数分成符号、指数和尾数
0 10000100 11110110110011001100110
1为符号+ 8位指数+ 23为尾数
S:0 二进制 = 0 (正符号)
E:10000100 二进制 = 1*27 + 0*26 + 0*25 + 0*24 + 0*23 + 1*22 + 0*21 + 0*20
= 128 + 0 + 0 + 0 + 0 + 4 + 0 + 0
= 132
M:11110110110011001100110 二进制 = 8087142
步骤2:计算十进制数
D = (-1)S * (1.0 + M/223) * 2E-127
= (-1)0 * (1.0 + 8087142/223) * 2132-127
= 1 * 1.964062452316284 * 32
= 62.85
===================================
如果有大佬愿意指点一下,小弟感激不尽
赞0
评论
2022-07-31
赞0
评论
2022-07-24
赞0
怎么会吃力?单精度浮点运算而已。现在的51有很快速的,比如STC的。
评论
2022-07-24
赞0
是的,如果两个数相乘那更吃力
评论
2022-07-24
赞0
确实是这样的,不需要这么费劲,直接转为浮点数就行,非常感谢指导
评论
2022-07-24
赞0
单片机很吃力,但是写程序的很省力,他的格式符合IEEE754单精度标准,支持float类型的编译器都要在库里面把转换功能做出来。
评论
2022-07-23
赞0
float f;
unsigned char *pa = (unsigned char *)&f;
unsigned char *pb = (unsigned char *)regbuff;
pa[0] = pb[3];
pa[1] = pb[2];
pa[2] = pb[1];
pa[3] = pb[0];
printf("%f",f);
输出:
62.85
评论
2022-07-23
赞0
这是典型的32bit浮点数,根本不需要想你发的这么费劲,只需要将读到的寄存器值当做浮点数来处理就好了:
假如你的MCU是大端模式:
unsigned short int regbuff[2];
modbus_read(addr,regbuff,2);//读两个寄存器
float *pf = (float*)buff;//转为浮点数指针
然后在需要用到数据的地方,直接用*pf就可以了,例如:
printf("%f",*pf);
就会输出:
62.85
假如你的系统是小端模式,则需要将浮点数的4个字节点到一下顺序。
评论
2022-07-23
赞0
评论
2022-07-23
您需要登录后才可以回复 登录 | 注册