急件!請教各位大大有關四BYTE16進位數值轉IEEE754浮點格式的方法 |
答題得分者是:Chance36
|
wychen57
一般會員 發表:32 回覆:77 積分:21 註冊:2003-10-04 發送簡訊給我 |
小弟撰寫一個利用VB MSCOMM元件做RS232通信,協定是MODBUS RTU,
送出一陣列值為
Function 03
Starting Address Hi 00
Starting Address Lo 6B
No. of Registers Hi 00
No. of Registers Lo 02
CRC Hi xx
CRC Lo xx
而傳回植為
Function 03
Byte Count 06
Register value Hi (108) 02
Register value Lo (108) 2B
Register value Hi (109) 00
Register value Lo (109) 00
但設備協定有註明Register 108~109共4 byte 為IEEE754格式之浮點型態數值,請教各位大大,教小弟如何轉換,感謝萬分,小弟的程式就差這步就完成了。
|
Brian77
中階會員 發表:8 回覆:114 積分:94 註冊:2002-05-17 發送簡訊給我 |
我找到這篇, 你可以參考看看:
http://140.111.104.1/kocp/mpu/m3/m3-2-3.htm#(4)浮點數
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
wychen57 你好
procedure TForm1.BitBtn1Click(Sender: TObject); Var s : Single; // 使用4 Byte p : pChar; begin s:= StrToFloat(Edit1.Text) ; p := @S; ShowMessage(IntToHex(ord(p[3]),2) ' ' IntToHex(ord(p[2]),2) ' ' IntToHex(ord(p[1]),2) ' ' IntToHex(ord(p[0]),2) ' ' ) ; end; 看看符不符你的需求 |
wychen57
一般會員 發表:32 回覆:77 積分:21 註冊:2003-10-04 發送簡訊給我 |
Chance36大大你好
我想我的表達可能不清楚
我的原意是暫存器108~109所傳回的4Byte值已經是IEEE754浮點值的16進制表示法,但小弟須把他轉成一般人看的懂的格式,寫入文字檔跟用LEBEL OR TEXT BOX秀在螢幕上,還盼大大不吝指導,感恩。
引言: wychen57 你好procedure TForm1.BitBtn1Click(Sender: TObject); Var s : Single; // 使用4 Byte p : pChar; begin s:= StrToFloat(Edit1.Text) ; p := @S; ShowMessage(IntToHex(ord(p[3]),2) ' ' IntToHex(ord(p[2]),2) ' ' IntToHex(ord(p[1]),2) ' ' IntToHex(ord(p[0]),2) ' ' ) ; end; 看看符不符你的需求 |
wychen57
一般會員 發表:32 回覆:77 積分:21 註冊:2003-10-04 發送簡訊給我 |
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
wychen57 你好
type pSingle = ^TSingle ; TSingle = record Case Integer Of 0: (AsSingle:Single); 1: (FirstHi,FirstLo,SecondHi,SecondLo:Byte); End; procedure TForm1.BitBtn1Click(Sender: TObject); Var p : PSingle; S : Single ; begin S := 23 ; P := @S ; // 讓P 指向S 的位址(使用同一塊記憶體) // 或是 P.AsSingle := 23 ; // 可以不用S 變數,只用P來操作亦可。 // 逐個Byte 轉成16進位字串 ShowMessage(' 23 = Hex ' IntToHex(P.FirstHi ,2) ' ' IntToHex(P.FirstLo ,2) ' ' IntToHex(P.SecondHi,2) ' ' IntToHex(P.SecondLo,2) ); // 改變P的值也等於改變S值 // 將取得的16進位字串一個Byte一個Byte塞進Single中 P.FirstHi := StrToInt('$00'); P.FirstLo := StrToInt('$00'); P.SecondHi := StrToInt('$2b'); P.SecondLo := StrToInt('$43'); ShowMessage('Hex 00 00 2b 43 =' FloatToStr(S) #13 'P.AsSingle = ' FloatToStr(P.AsSingle)); end; |
wychen57
一般會員 發表:32 回覆:77 積分:21 註冊:2003-10-04 發送簡訊給我 |
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
|
scchen98
一般會員 發表:2 回覆:2 積分:0 註冊:2003-12-26 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |