读串口数据遇到一个小小的问题,200求解......(200分)

  • 主题发起人 主题发起人 子瑜
  • 开始时间 开始时间

子瑜

Unregistered / Unconfirmed
GUEST, unregistred user!
我要做一个不断地读串口的程序,如刷卡,一刷卡,就有数据传到串口,
这时我的程序就实时地读到串口数据了,分析数据后,再把数据库中的
相关信息表现在用户界面上,我用定时器不断地读串口,是否可以?还
有好的方法吗?用线程可以吗?怎样用线程+定时器,请给个例子代码,
谢谢!请大家发表一下自己的看法.
 
线程+自定义定时器
 
肯定可以,建议你用串口控件MSComm来完成,很方!
 
最好用线程,不断读占时间太多
 
To:cpjin
能给个例子吗?
 
只用线程做,一个串口一个线程就够了,还用定时器干嘛!![8D]
 
To:loyal_jy,
那我如何不断地读串口?
 
用SPCOM吧!在串口有数据时会产生事件,在事件内读数据就可以了。
 
我读串口用的是MSComm,
谁能帮我用线程例子在后台不断的读数并发给主程序,
我的界面需要做其它的工作。
 
可以application.ProcessMessage;这个假线程来做,不过没用线程做好!
 
建立一个带有MSComm的线程类:
TthreadMSComm = class(TThread)
private
MSC: TMSComm;
.
.
.
然后在MSComm中OnComm事件中实现你的操作即可!
 
To:所有人
你们的回答我都不满意,最好花点时间,
给我一个具体的简单例子吧!!!!!!
不够再加分!!!
 
我觉得还是用api函数比较好,这好象用vc更方便简洁,我觉得刷卡的通讯协议也应该考虑吧!
 
我现在用Delphi+MsComm都做程序的大部分工作,还用Vc+Api恐怕
有点花不来吧。谢谢啦,请大家继续帮我吧!!!我等你们啦。。。。
 
用spcom,它本身就是用线程实现的,如果想自己做,也可以参考它的源代码。
 
再加200分!!!!!!!!!!!
 
根本不需要用线程来做,MSComm一检测到串口接收的数据达到
你设定的数据个数,就产生中断自动执行OnComm事件
那个数据个数在MSComm的属性里可以设,就是RThreshold
procedure TMainForm.MSComm1Comm(Sender: TObject);
var
Receive_Array:array of byte;
begin
if MSComm1.CommEvent=ComEvReceive then
begin
Receive_Array:=MSComm1.Input;
//接收到的数据在Receive_Array里
//加入你自己处理接收到的数据的代码
end;
end;
 
TthreadMSComm = class(TThread)
private
MSC: TMSComm;
 。
 。
 。
public
Constructor Create(Suspended: Boolean); overload;
procedure SetMSComm(Comm: TMSComm);
procedure onComm(Sender: TObject);

 。
 。
implementation

TThreadComm.Create(Suspended: Boolean)
begin
inherited Create(Suspended);
.。
 。
 。
end;
procedure TThreadComm.SetMSComm(Comm: TMSComm);
begin
MSC:=Comm;
if Assigned(MSC) then
MSC.OnComm;
end;
end;
 

 

procedure TCommunication.OnComm(Sender: TObject);
var
i, l, p: Integer;
addressLow: string;
begin
if msc.CommEvent <> comEvReceive then Exit;
SetLength(receiveBuffer, msc.InBufferCount);
receiveBuffer := msc.Input;
l := Length(sRec);
SetLength(sRec, l + Length(receiveBuffer));
for i := 0 to High(receiveBuffer) do
sRec[l + i + 1] := Chr(receiveBuffer);

 。
 。 
end;

再一个一Timer,要读数据时便Resume线程便可!具体就要你自己实现了!
这该够了吧。
 
$$$$$$$$$$$$$$$$$$$$$$
 
procedure TmainForm.Timer1Timer(Sender: TObject);
var
iScreen,iStation:integer;
screenAdd,stationAdd:byte;
begin
screenAdd:=byte($00);
for iScreen:=1 to screenNum do
begin
screenAdd:=screenAdd+byte($01);
stationAdd:=byte($00);
if iScreen<=6 then
begin

for iStation:=1 to stationNum do

begin

stationAdd:=stationAdd+byte($01);
msrcp.sendReadDataFrame(screenAdd,stationAdd);

communicate(screenAdd,stationAdd);
sleep(200);
end;
end
else begin
stationAdd:=stationAdd+byte($01);
msrcp.sendReadDataFrame(screenAdd,stationAdd);

communicate(screenAdd,stationAdd);
sleep(200);
end;
end;

end;
 
后退
顶部