2012-01-29 53 views
1

我正在使用舊的索尼愛立信手機編寫和閱讀AT命令的小型組件。 發送和寫入手機完全沒有問題,但是我希望能夠暫停我的SendATCmd功能並等待COM端口組件通知我有通知事件,然後再次恢復SendATCmd功能。如何在循環中發送更多數據之前等待COM端口接收事件

場景:我想獲得手機中短信的數量。 通常我只是告訴手機:嘿,你有多少條短信? ,手機會在通知事件中回覆。 這一切都很好。

但我真正想要做的是一樣的東西

if SendATCmd('CountSMS')>0 then 
    for 0 to SMSCount do 
    AddSMSToList; 

爲SendATCmd的代碼如下所示:

function TSE_Z1010.SendATCmd(Cmd: string): TATResult; 
begin 
    fCOMPort.PutString(Cmd); //Sending AT command 

    //Here is where I would like to pause this function 
    //wait for the fCOMPort to notify me when data is available 
    //and then resume this function again. 

    result:=fTMPATResult; 

end; 

我使用while循環試過,暫停,等等等等,但除了一件事之外沒有任何工作,那就是當我把ShowMessage放在暫停時。 我不知道ShowMessage如何在內部工作,但它似乎不會像while循環和暫停那樣暫停程序。

====================

修正了它。

我所要做的就是在使用條款中添加窗體,然後我加入,同時fTMPATResult.Full =假做Application.ProcessMessages;在我想暫停程序的部分。

「fTMPATResult」是其中輸入的COM端口的數據被存儲,在組件內的全局變量。

+4

,如果你有一個答案,請添加它作爲一個答案,而不是作爲一個編輯的問題。 – 2012-01-29 07:46:50

+0

它說我沒有足夠的分數來爲我自己的問題添加一個答案。 – xaid 2012-01-29 14:12:02

+0

什麼是您使用的串行通信組件(fCOMPort)? – menjaraz 2012-01-29 17:35:45

回答

1

雖然AsyncPro確實有基於此(ontriggerdata),他們是事件的一些解決方案,使代碼難以閱讀/理解。

這裏是SendAndWaitForResponse與AsyncPro(如雷米建議):

TForm1 = class(TForm) 
... 
private 
    IOEvent   : THandle; // used for IO events 
    IORx    : string; 
    Comport   : TapdComport; 
... 


procedure TForm1.ComportTriggerAvail(CP: TObject; Count: Word); 

var i  : integer; 

begin 
for i:=1 to Count do 
    IORx:=IORx+Comport.GetChar; 
SetEvent(IOEvent); 
end; 

function TForm1.SerialSAWR(tx : string; TimeOut : integer) : boolean; 
begin 
Result := False; 
try 
    IORx := ''; // your global var 
    ResetEvent(IOEvent); 
    Comport.PutString(tx); 
    Result := WaitForSingleObject(IOEvent, TimeOut) = WAIT_OBJECT_0; 
except 
    on E : Exception do 
    // dosomething with exception 
end; 
end; 

// constructor part 
IOEvent := CreateEvent(nil, True, False, nil); 
// destructor part 
if IOEvent <> 0 then 
    CloseHandle(IOEvent); 

最好的解決方案是創建一個具有COMPORT讓你的GUI不會被阻塞的線程。 我有幾個生產應用與Asyncpro這種方式,它就像一個魅力...

+0

我不明白在哪裏把構造函數的一部分和析構函數:( – ELCouz 2012-12-12 01:27:14

+0

@ElCouz:這取決於如果你使用的是一個窗體,那麼OnCreate事件和OnDestroy事件是很好的候選人 – whosrdaddy 2012-12-12 07:18:42

+0

謝謝!:)另一件事.. 。我沒有看到這個代碼中的任何地方RX部分在哪裏?我正在尋找一個像發送和獲取字符串(等待答案)的命令我看到你發送並等待答案,但它不捕獲答案:( – ELCouz 2012-12-12 19:06:57

0

你需要手動調用Application.ProcessMessages()任何時候,你需要重新考慮你的代碼設計。在循環中調用它時雙倍。

我不知道該如何非同步Pro的作品,但在Win32 API具有WaitCommEvent()功能,做你所要求的東西。您可以調用該函數向串口請求所需事件的通知,然後您可以使用WaitForOverlappedResult()WaitForSingleObject()等待這些事件實際發生,具體取決於串口是否在重疊模式下運行。不需要消息處理。如果Asynch Pro不以某種方式公開該功能,我會感到驚訝。

相關問題