ModbusTCP协议中读取浮点数的操作方法

首先膜拜大佬,感谢大佬造好的轮子,这里是原链接。

最近在搞一个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 

 

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;
}

ModbusTCP协议中读取浮点数的操作方法_第1张图片

你可能感兴趣的:(C++,点滴记录,漫漫QT路)