unit frmComm;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls,GeoUtils,GeoGPS;const MAXBLOCK = 160;type
 TComm = record
  idComDev : THandle;
  fConnected : Boolean;
    end;  TCommForm = class(TForm)
    ComboBox1: TComboBox;
    Button1: TButton;
    StatusBar1: TStatusBar;
    Button2: TButton;
    ComboBox2: TComboBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;  TCommThread = Class(TThread)
  protected
   procedure Execute;override;
  public
   constructor Create;
  end;var
  CommForm: TCommForm;
  CommHandle : THandle;
  Connected : Boolean;
  CommThread : TCommThread;implementation{$R *.DFM}uses
 frmMain,frmMdiMapView;procedure TCommThread.Execute;
var
 dwErrorFlags,dwLength : DWORD;
    ComStat : PComStat;
    fReadStat : Boolean;
    InChar : Char;
    AbIn : String;
    XX,YY : double; //经度、纬度    VID : string;  //车号
begin
 while Connected do begin
     GetMem(ComStat,SizeOf(TComStat));
  ClearCommError(CommHandle, dwErrorFlags, ComStat);
  if (dwErrorFlags > 0) then begin
            PurgeComm(CommHandle,(PURGE_RXABORT and PURGE_RXCLEAR));
           // return 0;
  end;
         dwLength := ComStat.cbInQue;
         if (dwLength>0) then begin
          fReadStat := ReadFile(CommHandle, InChar, 1,dwLength, nil);
   if (fReadStat) then begin     if (InChar <> Chr(13)) and (Length(abIn) < MAXBLOCK+5 ) then AbIn := AbIn + InChar
      else begin
                                      ...
                    {接收完毕,}
   end;//if (fReadStat>0){
  end; //if (dwLength>0){
  FreeMem(ComStat);
    end;{while}
end;constructor TCommThread.Create;
begin
 FreeOnTerminate := TRUE;
 inherited Create(FALSE);  //Createsuspended = false
end;//
procedure TCommForm.Button1Click(Sender: TObject);
varCommTimeOut : TCOMMTIMEOUTS;
    DCB : TDCB;
    fRetVal : Boolean;
begin
 StatusBar1.SimpleText := '连接中...';
 CommHandle := CreateFile(PChar(ComboBox1.Text),GENERIC_READ,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL 
, 0);
 if CommHandle = INVALID_HANDLE_VALUE then begin
  StatusBar1.SimpleText := '连接失败';
         Exit;
    end;
 StatusBar1.SimpleText := '已同端口 '+ ComboBox1.Text + ' 连接!';    
 CommTimeOut.ReadIntervalTimeout := MAXDWORD;
 CommTimeOut.ReadTotalTimeoutMultiplier := 0;CommTimeOut.ReadTotalTimeoutConstant := 0;
    SetCommTimeouts(CommHandle, CommTimeOut);    GetCommState(CommHandle,DCB);
 DCB.BaudRate := 9600;
    DCB.ByteSize := 8;
    DCB.Parity := NOPARITY;
    DCB.StopBits := ONESTOPBIT;
 fRetVal := SetCommState(CommHandle, DCB);
    if (fRetVal) then begin
     Connected := TRUE;
  try
          CommThread := TCommThread.Create;
  except
          Connected := FALSE;
   CloseHandle(CommHandle);
              fRetVal := FALSE;
   StatusBar1.SimpleText := '线程建立失败';
              Exit;         end;
    end
    else begin
  Connected := FALSE;
      CloseHandle(CommHandle);
    end;
end;procedure TCommForm.Button2Click(Sender: TObject);
begin
    Connected := FALSE;
 CloseHandle(CommHandle);
    {终止线程}
    CommThread.Terminate;
 StatusBar1.SimpleText := '关闭端口'+ComboBox1.Text;
end;procedure TCommForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    Connected := FALSE;
 CloseHandle(CommHandle); StatusBar1.SimpleText := '关闭端口'+ComboBox1.Text;
end;end.

解决方案 »

  1.   

    开一个线程一直查询串口是否有数据,如果有就发消息,启动读数据的函数进行处理,好好的看一下WINDOWS这方面的在线帮助,编好一个串口通讯控件需要用到很多方面的知识,不过,如果你编好后以后的事情就轻松、方便多了,而且灵活、稳定、可靠,终生受用,对串口通讯原理也清楚了。如果不是专门搞通信方面的编程,可以使用一下现成的控件。
      

  2.   

    comm=Class(TTread)
    var hcom:THnadle;
    ReadFile(hcom,read_buffer,dbnum,rednumber,lpol);
    //处理接收数据
    procedure TForm1.FormCreate(Sender:TObject);
    begin
      comminitialize;
      comm.create(false)//创建穿行口监视线程
    end;