unit MainUnit;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, MSCommLib_TLB;type
TForm1 = class(TForm)
Comm: TMSComm;
procedure CommComm(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
procedure initComm;
end; TScanComData = class(TThread)
private
protected
procedure Execute; override;
public
constructor Create;
destructor Destroy;override;
end;
var
Form1: TForm1;
ScanComData:TScanComData;
implementation{$R *.dfm}{ TScanComData }constructor TScanComData.Create;
begin
inherited Create(True);
FreeOnTerminate := True;
end;destructor TScanComData.Destroy;
begin
inherited Destroy;
end;procedure TScanComData.Execute;
var
ole:Olevariant;
i:Integer;
begin
// while True do
// begin
Form1.initcomm;
Form1.comm.RThreshold:=7;//23;
if Form1.comm.PortOpen=false then
Form1.comm.PortOpen:=true;
Form1.comm.DTREnable:=true;
Form1.comm.RTSEnable:=true;
// ReadComCount:=0;
// bIfSend:=True;
ole:=VarArrayCreate([0 ,7],varByte);
ole[0]:= $02;
ole[1]:= $01;
ole[2]:= $08;
ole[3]:= $00;
ole[4]:= $00;
ole[5]:= $02;
ole[6]:= $00;
ole[7]:=0;
for i := 0 to 6 do
ole[7]:=ole[7] xor ole[i];
// ole[7]:= $09;
// Self.Caption:=IntToStr(ole[7]);
Form1.comm.Output := ole;
// end;
end;{ TForm1 }procedure TForm1.CommComm(Sender: TObject);
var
ole:Olevariant;
str:String;
i:Integer;
begin
if (Comm.CommEvent=2)then
begin
// 读卡号(扫描)
if Comm.RThreshold = 7 then
begin
ole:=Comm.Input;
for i:=0 to Comm.RThreshold - 1 do
begin
str:= str + ',' + IntToHex(ole[i],2);
end;
Self.Caption:= String(str);
end;
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
ScanComData:= TScanComData.Create;
ScanComData.Resume;
end;procedure TForm1.initComm;
begin
if comm.PortOpen=true then
comm.PortOpen:=false;
comm.Settings:='38400,n,8,1';
comm.InBufferCount:=0; //清空缓冲区
comm.OutBufferCount:=0;
comm.InputLen:=0;
comm.CommPort:= 2;
end;end.为什么进不去commcomm这个事件呀 应该触发了呀!
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, MSCommLib_TLB;type
TForm1 = class(TForm)
Comm: TMSComm;
procedure CommComm(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
procedure initComm;
end; TScanComData = class(TThread)
private
protected
procedure Execute; override;
public
constructor Create;
destructor Destroy;override;
end;
var
Form1: TForm1;
ScanComData:TScanComData;
implementation{$R *.dfm}{ TScanComData }constructor TScanComData.Create;
begin
inherited Create(True);
FreeOnTerminate := True;
end;destructor TScanComData.Destroy;
begin
inherited Destroy;
end;procedure TScanComData.Execute;
var
ole:Olevariant;
i:Integer;
begin
// while True do
// begin
Form1.initcomm;
Form1.comm.RThreshold:=7;//23;
if Form1.comm.PortOpen=false then
Form1.comm.PortOpen:=true;
Form1.comm.DTREnable:=true;
Form1.comm.RTSEnable:=true;
// ReadComCount:=0;
// bIfSend:=True;
ole:=VarArrayCreate([0 ,7],varByte);
ole[0]:= $02;
ole[1]:= $01;
ole[2]:= $08;
ole[3]:= $00;
ole[4]:= $00;
ole[5]:= $02;
ole[6]:= $00;
ole[7]:=0;
for i := 0 to 6 do
ole[7]:=ole[7] xor ole[i];
// ole[7]:= $09;
// Self.Caption:=IntToStr(ole[7]);
Form1.comm.Output := ole;
// end;
end;{ TForm1 }procedure TForm1.CommComm(Sender: TObject);
var
ole:Olevariant;
str:String;
i:Integer;
begin
if (Comm.CommEvent=2)then
begin
// 读卡号(扫描)
if Comm.RThreshold = 7 then
begin
ole:=Comm.Input;
for i:=0 to Comm.RThreshold - 1 do
begin
str:= str + ',' + IntToHex(ole[i],2);
end;
Self.Caption:= String(str);
end;
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
ScanComData:= TScanComData.Create;
ScanComData.Resume;
end;procedure TForm1.initComm;
begin
if comm.PortOpen=true then
comm.PortOpen:=false;
comm.Settings:='38400,n,8,1';
comm.InBufferCount:=0; //清空缓冲区
comm.OutBufferCount:=0;
comm.InputLen:=0;
comm.CommPort:= 2;
end;end.为什么进不去commcomm这个事件呀 应该触发了呀!
如果要用线程,就把串口全部放到线程里操作。在线程里动态创建串口,收发数据,然后通过消息通知主线程。
还有串口控件建议用CPort、Spcomm
检查一下,是否这个属性设置有问题
BufferLength检查一下这个属性设置,是不是过大