串口通信难题, 200分相送,不够再加200或更多(200分)

  • 主题发起人 主题发起人 Benjamin.JI
  • 开始时间 开始时间
B

Benjamin.JI

Unregistered / Unconfirmed
GUEST, unregistred user!
PC控制硬件
我用的控件是SPComm,我写了一个 SendCommand 的函数用来发送指令, 在这个函数里面调用WriteCommData方法发送指令, 发送完后我想等待接收到指令并根据发送的指令判断接收的指令是否正确,给出相应的函数返回值, 同时在发送指令后开始记时, 如果在规定的时间内未接收到指令, 则函数也结束, 并给出超时的返回值
请高手帮忙
请具体点回答我的问题, 分不够再加200或更多
 
急啊, 請高手幫忙啊!!!!!!!!!!!!!!!!!!!!!!!!!!
 
在发送函数里的WriteCommData();后面加上
Application.ProcessMessages;
就可以响应接收事件了。
你在接收事件里处理接收数据,把结果放在一个全局变量里,
在发送函数里判断这个全局变量的值就可以了。
function sendCommand();
begin
WriteCommData();
timer1.enable:=true;
rxcode:='';
while rxcode='' do Application.ProcessMessages;
case rxcode of
'ok':.....exit;
'timeout':.....exit;
.....
end;
procedure TForm1.Comm1ReceiveData();
begin
if s='123' then rxcode:='ok';
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
rxcode:='timeout';
end;
 
maxim88说的没错,但也可以使用waitobject函数等待,当超时或收到数据则reset就可以了
 
同意楼上的,也可以通过以下进行超时处理,其中MSecs单位为毫秒。
FirstTickCount := GetTickCount();
while ((rxcode='') and (Now - FirstTickCount <= MSecs)) do
begin
Application.ProcessMessages;
Now := GetTickCount();
end
 
我有用過
function sendCommand();
begin
......
WriteCommData();
ResetEvent();
WaitForSingleObject()
.....
end
procedure TForm1.Comm1ReceiveData();
begin
...
SetEvent();
end;

但是不行, 因為 Comm1 也是運行在主線程中, WaitForSingleObject,
Comm1ReceiveData(); 即使接收到了數據也不會响應, 而是
function sendCommand();執行完之後才响應

TO: maxim88
你的方法你自己有沒有試過呢, 結果如何?
我今晚試試, 如果行, 明天上午結帖.
 
Application.ProcessMessages;就是让你响应其他事件的
放心吧,肯定行。
其实你用下面这种结构更合适一些
procedure TForm1.button1click();
begin
WriteCommData(首发数据);
timer.enable:=true;
end;
procedure TForm1.Comm1ReceiveData();
begin
if s='123' then WriteCommData();
if s='456' then WriteCommData();
timer.enable:=true;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
showmessage('设备无应答');
timer1.enable:=false;
end;
 
非常感謝各位的幫忙, 特別是maxim88, 謝謝!!![:)]

問題已解決, maxim88的答案正確

另外, TO jamcky: waitobject 如何用呢, 能否詳細點告訴我? 因為我有用過WaitForSingleObject, 結果不行, 所以請詳細點告訴我如何?
另外開帖送分

今天白天在線等, 謝謝
 
帮你顶吧!
 
你试一试这样看看,我使用在过程中,没有使用函数。其中post_event是在主线程中创建的,waitingtime为等待时间。

post_Event :=CreateEvent(nil,true,true,nil);

function sendCommand(post_event,waitingtime);
begin
......
Resetevent(post_event);
WriteCommData();
WaitForSingleObject(post_event,waitingtime)
.....
end
procedure TForm1.Comm1ReceiveData();
begin
...
SetEvent(post_event);
end;
 
TO jamcky:
這個方法我以前有試過, 結果不行
 
不管了, 結帖, 如果誰還有其他的辦法解決, 請發郵件到我郵箱

xpx_10@126.com

只要答案正確我一定開帖送分, 謝謝各位了!!!

快過年了, 給大家拜個早年, 祝各位同仁狗年財運旺旺!!!![:)][:)]
 
多人接受答案了。
 
不会阿,我现在还一直在用呢,是不是你的事件创建位置不对?我在多线程中使用都很稳定,只不过每个串口都对应一个post_event事件,还有,你要确保接收部分运行了SetEvent(),若还是不行,把部分代码发给我,我帮你看看,jamscheng2003@yahoo.com.cn
 
謝謝jamcky, 也許吧, 我再試試 , 我是在 WriteCommData 後創建的,
我再去試試, 謝謝啦!!!
能行的話我再開帖, 不過要到年後, 我明天放假了.
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
730
SUNSTONE的Delphi笔记
S
后退
顶部