關於把整形數據轉化爲浮點型float 輸出。

我用rs485通信時,需要接收兩個16位的寄存器的數據,然後把這兩個16bits的數據,組合成一個float型數據。


兩個寄存器要傳輸的值爲 3.14 ,按照modbus RTU 的float 方式發送,則會發送0xc4048f5c3 ,此時寄存器的存儲方式爲:高字節在後,低字節在前,低字在前,高字在後。

則寄存器1的值爲:f5c3

寄存器2的值爲4048


然後在接收端,用4個unsigned char 來裝。即

unsigned char a = 0xc3;
unsigned char b = 0xf5;
unsigned char c = 0x48;
unsigned char d = 0x40;


此時,這些爲十六進制數。要轉化爲浮點數輸出,需要兩步。

1: unsigned int   e = (unsigned int)( a + (b << 8) + (c <<16) + (d <<24) );

2: float *f = (float *)&e;


首先把 a、b、c、d  四個數轉化爲它的真實數值,存儲在unsigned int 型的 e 中,然後是第二步,把e的地址,解釋成float型的地址,傳遞給f。

在這之後,f 存儲的數據將是float 型的 e 地址。之後 調用  *f ,將把 e 裏面的數據 以float 類型來解析。因此得到 3.140000.


大致程序爲以下:


#include<iostream>
#include<string.h>
using namespace std;
int main()     //4048f5c3
{
	unsigned char a = 0xc3;
	unsigned char b = 0xf5;
	unsigned char c = 0x48;
	unsigned char d = 0x40;
	unsigned int e = (unsigned int)( a + (b << 8) + (c <<16) + (d <<24) );
	float *f = (float *)&e;
	unsigned char *lp;
	int i;
	float j = 3.14f;
	lp = (unsigned char *)&(*f);
	for(i = 0;i <sizeof(j);i++)
	{
		printf("lp[%d] is %.2x\n",i,lp[i]);
	}
	printf("b is %f\n",*f);
	
	while(1);
}

裏面的 lp 指針,只是用於打印出 *f  的數據而已,按低字節打印。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章