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这个事件呀 应该触发了呀!

解决方案 »

  1.   

    先不要用线程,你这个线程也只是让串口发下数据而已,然后用串口调试程序看下你发的数据,有没返回数据。
    如果要用线程,就把串口全部放到线程里操作。在线程里动态创建串口,收发数据,然后通过消息通知主线程。
    还有串口控件建议用CPort、Spcomm
      

  2.   

    MSComm有一个数据长度的属性,忘记叫什么名字了,用来触发Oncomm事件,
    检查一下,是否这个属性设置有问题
      

  3.   

    建议用spcomm
      

  4.   


    BufferLength检查一下这个属性设置,是不是过大