串口收发线程 ( 积分: 60 )

  • 主题发起人 主题发起人 hfutzhu
  • 开始时间 开始时间
H

hfutzhu

Unregistered / Unconfirmed
GUEST, unregistred user!
我用spcomm写串口程序,大概流程是: 上位机向下位机发送个请求,下位机收到后应答,发数据给上位机,上位机收到数据存到数据库中,但是在串口发送或是收到数据存到数据库时,写的程序就像死了一样,我想写一个发线程和一个收线程,不知道这样可以么?写了之后老是不对!哪位兄弟指导一下,或是有什么实例?只有60分了 不好意思!着急!
 
程序象死了一样?你的线程中是不是用到主线程的资源了?
其实一个线程就足够了,关键是把线程中数据的处理流程和相关资源处理好,如果要和其他线程共享的资源(包括主线程),需要加临界区或互斥量保护。
 
给你看这个,我正在用的,用的是CPort
unit unJSKMonitorThread;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Contnrs, unGeneral, unPublic, unCommPub, unGreaser;
type
TJSKMonitorThread = class(TThread)
private
{ Private declarations }
FJSKList:TObjectList;
protected
procedure Execute;
override;
procedure JSKQueryCycle;
procedure ThreadTerminateX(Sender:TObject);
public
constructor Create(AList:TObjectList);
end;

implementation
uses
unMonitor;
{ TJSKMonitorThread }
constructor TJSKMonitorThread.Create(AList:TObjectList);
begin
inherited Create(True);
FJSKList:=AList;
OnTerminate:=ThreadTerminateX;
end;

procedure TJSKMonitorThread.Execute;
begin
FreeOnTerminate:=True;
JSKQueryCycle;
end;

procedure TJSKMonitorThread.JSKQueryCycle;
var
i:Integer;
jsk:TGreaserJSK;
begin
while Truedo
begin
if Terminated then
Break;
for i := 0 to FJSKList.Count -1do
begin
if Terminated then
Break;
jsk:=TGreaserJSK(FJSKList);
if jsk.Enabled then
begin
try
Synchronize(jsk.CheckState);
//这里用到主线程动态创建的串口组件
if jsk.JSKStaErr <> jeNone then
begin
SendMessage(frmMonitor.Handle,WM_JSKSTATEERROR,Ord(jsk.JSKStaErr),i);
end
else
begin
//单机发油模式
if jsk.JSKModel = jmManual then
begin
PostMessage(frmMonitor.Handle,WM_JSKMANUALPROC,0,i);
end
else
if jsk.JSKModel = jmAuto then
begin
//空闲
if jsk.JSKState = jsIdle then
begin
PostMessage(frmMonitor.Handle,WM_JSKGREASERPROC,GS_IDLE,i);
end
//申请发油
//else
if (jsk.JSKState = jsApply) and (jsk.RealTimeValue = 0) then
else
if jsk.JSKState = jsApply then
begin
SendMessage(frmMonitor.Handle,WM_JSKGREASERPROC,GS_APPLY,i);
end
//加油中
else
if jsk.JSKState = jsBusy then
begin
SendMessage(frmMonitor.Handle,WM_JSKGREASERPROC,GS_BUSY,i);
end
//加油完成
else
if jsk.JSKState = jsComplete then
begin
SendMessage(frmMonitor.Handle,WM_JSKGREASERPROC,GS_COMPLETE,i);
end;
end;
end;
except
on E:ECommStatedo
begin
SendMessage(frmMonitor.Handle,WM_JSKCOMMERROR,E.Code,i);
end;
end;
end;
//DelayEx(CycleSeprator);
Delay(0,CycleSeprator);
end;
end;
end;

procedure TJSKMonitorThread.ThreadTerminateX(Sender: TObject);
begin
PostMessage(frmMonitor.Handle,WM_JSKTHREADTERMINATE,0,0);
end;

end.
 
nicai你好 我的意思你没理解!我没用线程写,在请求和接受 操作数据库的时候整个窗体要死了一样!现在我想用线程写,不知道怎么写??
 
检查一下程序吧
不是搞多几个线程就可以解决的,spcomm里本身已封装了读线程和写线程的
 
一个独立的线程足矣
关键是要处理好线程之间的协调
 
Spcomm没用过,用过API
如果只是上位机(人为操作)要时下位机返数据,
用api写一个串口监视线程,或用中断,
主线程发送与处理数据,不用事件,临界区也可以,
 
写的程序就像死了一样
应该是在接收数据时的处理不当,造成一直在循环中吧.
 
to hfutzhu:
用winapi打开串口(使用overlapped方式打开),在主程序中发送数据时程序就不会死在那里了,建一线程监视串口接收,当接收完数据向主程序发一消息,有主程序读取串口接收数据。
 
后退
顶部