我用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 的數據而已,按低字節打印。