首先膜拜大佬,感谢大佬造好的轮子,这里是原链接。
最近在搞一个modbusTCP的通讯,我对modbus的了解基本停留在最最最简单的应用,突然一个读取浮点数的问题我就蒙圈了!!!,再此感谢大佬们!!!代码如下:
寄存器一般读到的是unsigned short,两个字节,float占两个寄存器,value1、value2对应两个寄存器的值。
float getFloat(unsigned short value1, unsigned short value2)
{
int intSign, intSignRest, intExponent, intExponentRest;
float faResult, faDigit;
intSign = unit.value(32) / 32768;
intSignRest = unit.value(32) % 32768;
intExponent = intSignRest / 128;
intExponentRest = intSignRest % 128;
faDigit = (float)(intExponentRest * 65536 + unit.value(33)) / 8388608;
faResult = (float)pow(-1, intSign) * (float)pow(2, intExponent - 127) * (faDigit + 1);
return faResult;
}
C++/C 应该能直接用,记得包含
#include <math.h>
2018.1.16更新
又学了一种处理方式:
float getFloat(quint16 value1, quint16 value2)
{
float fTemp;
uint *pTemp=(uint *)&fTemp;
unsigned int chTemp[4];//a,b,c,d
chTemp[0]=value1&0xff;
chTemp[1]=(value1>>8)&0xff;
chTemp[2]=value2&0xff;
chTemp[3]=(value2>>8)&0xff;
//这是ABCD
*pTemp=((chTemp[1]<<24)&0xff000000)|((chTemp[0]<<16)&0xff0000)|((chTemp[3]<<8)&0xff00)|(chTemp[2]&0xff);
//这是CDAB
//*pTemp=((chTemp[3]<<24)&0xff000000)|((chTemp[2]<<16)&0xff0000)|((chTemp[1]<<8)&0xff00)|(chTemp[0]&0xff);
//这是BADC
//*pTemp=((chTemp[0]<<24)&0xff000000)|((chTemp[1]<<16)&0xff0000)|((chTemp[2]<<8)&0xff00)|(chTemp[3]&0xff);
//这是DCBA
//*pTemp=((chTemp[2]<<24)&0xff000000)|((chTemp[3]<<16)&0xff0000)|((chTemp[0]<<8)&0xff00)|(chTemp[1]&0xff);
return fTemp;
}