Modbus-RTU读取Float和Double值

Modbus-RTU读取Float和Double值

#include "stdafx.h"
#include <iostream>
using namespace std;

float getFloat(unsigned short value1, unsigned short value2);
double getDouble(unsigned short value1, unsigned short value2, unsigned short value3, unsigned short value4);

int _tmain(int argc, _TCHAR* argv[])
{
    //1.25
    float fff = getFloat(0x00,0x3FA0);
    cout << "float:" << fff <<endl;

    //1.256
    double ddd = getDouble(0x6A7F,0x74BC,0x1893,0x3FF4);
    cout << "double:" << ddd <<endl;

    int stop;
    cin >> stop;

    return 0;
}

float getFloat(unsigned short value1, unsigned short value2)
{
    float fTemp;
    unsigned int *pTemp=(unsigned int *)&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 ==> OK 
    *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;
}


double getDouble(unsigned short value1, unsigned short value2, unsigned short value3, unsigned short value4)
{
    double fTemp;
    unsigned long long *pTemp=(unsigned long long *)&fTemp;
    unsigned long long chTemp[8];//A,B,C,D,E,F,G,H

    chTemp[0]=value1&0xff;
    chTemp[1]=(value1>>8)&0xff;
    chTemp[2]=value2&0xff;
    chTemp[3]=(value2>>8)&0xff;
    chTemp[4]=value3&0xff;
    chTemp[5]=(value3>>8)&0xff;
    chTemp[6]=value4&0xff;
    chTemp[7]=(value4>>8)&0xff;

    //这是AB CD EF GH
    //*pTemp =   ((chTemp[1]<<56)&0xff00000000000000)
    //          |((chTemp[0]<<48)&0x00ff000000000000)
    //          |((chTemp[3]<<40)&0x0000ff0000000000)
    //          |((chTemp[2]<<32)&0x000000ff00000000)
    //          |((chTemp[5]<<24)&0x00000000ff000000)
    //          |((chTemp[4]<<16)&0x0000000000ff0000)
    //          |((chTemp[7]<< 8)&0x000000000000ff00)
    //          |((chTemp[6]<< 0)&0x00000000000000ff);

    //这是GH EF CD AB // ==> OK 
    *pTemp =   ((chTemp[7]<<56)&0xff00000000000000)
              |((chTemp[6]<<48)&0x00ff000000000000)
              |((chTemp[5]<<40)&0x0000ff0000000000)
              |((chTemp[4]<<32)&0x000000ff00000000)
              |((chTemp[3]<<24)&0x00000000ff000000)
              |((chTemp[2]<<16)&0x0000000000ff0000)
              |((chTemp[1]<< 8)&0x000000000000ff00)
              |((chTemp[0]<< 0)&0x00000000000000ff);

    //这是BA DC FE HG
    //*pTemp =   ((chTemp[0]<<56)&0xff00000000000000)
    //          |((chTemp[1]<<48)&0x00ff000000000000)
    //          |((chTemp[2]<<40)&0x0000ff0000000000)
    //          |((chTemp[3]<<32)&0x000000ff00000000)
    //          |((chTemp[4]<<24)&0x00000000ff000000)
    //          |((chTemp[5]<<16)&0x0000000000ff0000)
    //          |((chTemp[6]<< 8)&0x000000000000ff00)
    //          |((chTemp[7]<< 0)&0x00000000000000ff);

    //这是HG FE DC BA
    //*pTemp =   ((chTemp[6]<<56)&0xff00000000000000)
    //          |((chTemp[7]<<48)&0x00ff000000000000)
    //          |((chTemp[4]<<40)&0x0000ff0000000000)
    //          |((chTemp[5]<<32)&0x000000ff00000000)
    //          |((chTemp[2]<<24)&0x00000000ff000000)
    //          |((chTemp[3]<<16)&0x0000000000ff0000)
    //          |((chTemp[0]<< 8)&0x000000000000ff00)
    //          |((chTemp[1]<< 0)&0x00000000000000ff);

    return fTemp;
}

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值