最近在写modbus的通讯编程。需要通过485去读取电能表中的数据获得到的数据位四位的byte[]型,但是我需要转换成单精度浮点型。编程的时候总出错了。网上找了很多,花了2天的时间也没有搞定。有很多的方法,写了很多的小demo。其实最后发现很简单。
需求:四位的byte[] data转换成对应的float.
收到数据为9位16进制的数据:02 04 04 3D 23 D7 0A EB 15 ,根据modbus协议第一位02是站位地址,第二位04是功能码,第三位04是数据位数,说明接下来的4位是数据3D 23 D7 0A。最后的EB 15是CRC校验码.
新定义byte[]=3D 23 D7 0A;
如果直接把3D 23 D7 0A转换为float型会出错。
float energyTemp = System.BitConverter.ToSingle(data);
因为在C#中。float转换为byte[]之后的数据是顺序是反着来的。就是高位在左面,低位在右边。所以需要对byte[]先进行转换。换成byte[]= 0A D7 23 3D。然后再用BitConverter就对了。实现语句如下:
byte[] NetRd = {0x02, 0x04, 0x01, 0x00, 0x00, 0x02, 0x70, 0x04 }
byte[] buffer = new byte[1024 * 1024 * 2];
int aa = connection.Receive(buffer);
byte[] data = new byte[4];
for (int i = 0; i < 4; i++)
{
data[3 - i] = buffer[i + 3];
}
float energyTemp = System.BitConverter.ToSingle(data);
double tempEnergy = (double)energyTemp;