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

如何利用SPComm讀取資料(非觸發)

答題得分者是:hagar
kan0515
中階會員


發表:56
回覆:120
積分:50
註冊:2002-06-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-12-13 16:39:15 IP:211.23.xxx.xxx 未訂閱
請教各位前輩 如何利用spcomm去讀取資料,而不是利用它內建的觸發事件? 謝謝`~
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-12-13 17:14:00 IP:202.39.xxx.xxx 未訂閱
為什麼不用它內建的觸發事件?    -- Everything I say is a lie.
kan0515
中階會員


發表:56
回覆:120
積分:50
註冊:2002-06-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-12-13 17:49:00 IP:211.23.xxx.xxx 未訂閱
因為… 因為資料必須處理… 因為後面還有其他程序要執行 因為資料檢查有問題 因為… 我目前是利用觸發的方式拿取資料 但是發生了 1、程序錯誤~ 2、資料錯誤~ 所以…才會請教各位前輩可否有方法讓我可以不用觸發的方式 去拿取資料 謝謝~
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-12-13 17:55:05 IP:202.39.xxx.xxx 未訂閱
您可以用如下的方式:
begin
  spcomm1.WriteCommData(...); // 送出資料
  Application.ProcessMessages;
  DelayMSec(300); // Delay 300 ms, 在這等待期間, 觸發 SPComm 接收的動作 
  ...; // 做接下來的事
end;
   
procedure DelayMSec(MSec: Word);
var BeginTick: Word;
begin
  BeginTick := GetTickCount;
  while (GetTickCount - BeginTick <= 300) do begin
    Application.ProcessMessages;
    Sleep(30);
  end;
end;
-- Everything I say is a lie. 發表人 - hagar 於 2002/12/13 17:59:54
kan0515
中階會員


發表:56
回覆:120
積分:50
註冊:2002-06-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-12-13 18:05:14 IP:211.23.xxx.xxx 未訂閱
拍謝~~ 這招也試過了… 若資料錯誤,重新送出資料, 並等待觸發的事件,就會… 算是邏輯錯誤吧, 變成不會重送資料,也不會等待觸發事件
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-12-13 18:15:27 IP:202.39.xxx.xxx 未訂閱
var
  GotResult: Boolean;    procedure Send;
var i: integer;
begin
  for i := 1 to 3 do begin
    GotResult := False;
    spcomm1.WriteCommData(...); // 送出資料
    Application.ProcessMessages;
    DelayMSec(300); 
    if not GotResult then 
      if i < 3 then
        Continue // 沒收到預期字串, 再送一次
      else
        Exit; // 送了 3 次都沒收到預期字串
    end;
    ...; 
  end;
end;
   
procedure DelayMSec(MSec: Word);
var BeginTick: Word;
begin
  BeginTick := GetTickCount;
  while (GetTickCount - BeginTick <= 300) do begin
    Application.ProcessMessages;
    Sleep(30);
  end;
end;    procedure TFCOMM.Comm1ReceiveData(Sender: TObject; Buffer: 
  Pointer; BufferLength: Word); 
var sTmp: string;
begin 
  SetLength(sTmp, BufferLength);
  Move(buffer^, pchar(sTmp)^, BufferLength); 
  if sTmp = 'RespectedString' then
    GotResult := True; // 收到要的字串
end;
-- Everything I say is a lie.
kan0515
中階會員


發表:56
回覆:120
積分:50
註冊:2002-06-24

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-12-16 09:15:08 IP:211.23.xxx.xxx 未訂閱
感謝前輩的指導~~謝謝~
系統時間:2024-04-24 16:18:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!