我正在开发一个小组件,用于使用旧的索尼爱立信手机编写和读取 AT 命令。
向手机发送和写入数据完全没有问题,但是我希望能够暂停 SendATCmd 函数并等待 COM 端口组件通过通知事件通知我,然后再次恢复 SendATCmd 函数。
场景:我想获取手机中短信的数量。
通常我只是告诉电话:嘿,你有多少条短信?
并且手机会在通知事件中回复。
这一切都很好。
但我真正想做的是
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 循环和暂停那样停止程序。
===================
修复。
我所要做的就是在uses子句中添加Forms,然后添加 while fTMPATResult.Full=false do Application.ProcessMessages;在我想暂停程序的部分。
“fTMPATResult”是组件内全局存储传入 COM 端口数据的变量。
虽然 AsyncPro 确实有一些解决方案(ontriggerdata),但它们是基于事件的,使得代码难以阅读/理解。
这是带有 AsyncPro 的 SendAndWaitForResponse (就像 Remy 建议的那样):
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 的应用程序在生产中,它的工作方式就像一个魅力......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)