關於32位浮點數轉整形的相關知識可以參考這篇博客:https://blog.csdn.net/u011575671/article/details/74518933
用Modbus讀PLC的浮點數寄存器的時候讀取的內容爲IEEE 754標準的32位寄存器,需要轉換一下,可以根據自己的需求轉換,直接貼代碼:
//============================================================
//函數名稱 :Float32
//函數功能 :將32位的float轉換爲10進制正數(0~99999)捨棄小數,IEEE 754標準
//輸入變量 :NumFloat32:待轉換32位浮點數
//返 回 值 :計算結果 無符號整形 u32 ,返回-1爲負數或者超限;
//調試記錄 :
//============================================================
unsigned int Float32(const unsigned int NumFloat32)
{
unsigned char sbit,ebits;
unsigned int mbits,result;
sbit = NumFloat32 >> 31;
ebits = ( NumFloat32 >> 23 ) & 0xff ;
mbits = NumFloat32 & 0x7fffff ;
if(sbit) //若需要負數部分,sbit爲1時,result*-1,去掉判斷;
{
return -1 ;
}
ebits -= 127; //得到階碼<0,即結果小於1,返回0;
if(ebits < 0)
{
return 0;
}
result = (1 << ebits) +(mbits >> (23 - ebits));
/*若有小數位數精度要求,mbits的0~(23 - ebits)位可以適當保留處理;可以進行自定義處理
result = (1 << ebits) +(mbits >> (23 - ebits)); 改爲 result = (1 << (ebits + 10))* 1000 / 1024 + (mbits >> (13 - ebits)) * 1000 / 1024 ;
結果擴大了1000倍,result/1000爲整數部分,result%1000爲小數*/
if(result > 99999)
{
return -1 ;
}
printf("result = %d\n",result);
return result;
}