線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2525
推到 Plurk!
推到 Facebook!

急件!請教各位大大有關四BYTE16進位數值轉IEEE754浮點格式的方法

答題得分者是:Chance36
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-03 00:09:59 IP:211.76.xxx.xxx 未訂閱
小弟撰寫一個利用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-03 00:56:58 IP:61.221.xxx.xxx 未訂閱
我找到這篇, 你可以參考看看: http://140.111.104.1/kocp/mpu/m3/m3-2-3.htm#(4)浮點數
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-03 01:20:50 IP:203.204.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-03 11:28:38 IP:211.76.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-03 12:02:31 IP:211.76.xxx.xxx 未訂閱
Chance36大大你好 小弟忘了說,我用的是Delphi7,pchar已經變成unsave,compiler會有warning ,有沒有解決辦法;還有,小弟用陣列型態送資料,但MSCOMM元件接受的是string格式,小弟能不能將傳送資料跟接受的資料都用string型態,如何可以,要如何將每個byte餵給string呀,感謝你的指導
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-07-04 00:49:10 IP:203.204.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-07-04 15:17:10 IP:211.74.xxx.xxx 未訂閱
可以用了,太太太太太太太感謝大大了,可以再問一下嗎,mscomm接收的資料如果很長(很多byte之意),如何從buffer中截取,buffer要定義成何種資料型態,小弟用慣了vb,但想轉用delphi才能寫低階語言所能做的功能(如asm),若有問些白痴問題,還請見諒
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-07-05 02:45:58 IP:203.204.xxx.xxx 未訂閱
wychen57 你好 即然是很多Byte 那麼可以用 Array Of Byte; 當Buffer Buffer : Array[0.4095] Of Byte ; // 一次配置4K的空間 或 Buffer : Array[0.4095] Of Char ; // 一次配置4K的空間 或 ...... 視實際狀況自由選用
scchen98
一般會員


發表:2
回覆:2
積分:0
註冊:2003-12-26

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-07-05 09:36:40 IP:61.66.xxx.xxx 未訂閱
chance36大大 感謝你不吝指導,真是太感謝了
系統時間:2017-10-22 5:31:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!