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