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

本文分享了两种从ModbusTCP读取浮点数的方法,一种通过位操作和数学公式转换,另一种利用内存地址映射实现,适用于C++/C开发者。

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

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值