var hcom : Thandle;
    Wrlap,Rdlap : Toverlapped;procedure TForm1.Button1Click(Sender: TObject);
VAR CC : TCommConfig;
begin
  hcom := createfile('com1',GENERIC_READ OR GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,0);
  if hcom = INVALID_HANDLE_VALUE then
  SHOWMESSAGE('打开串口失败')
  else
  begin
     GetCommState(hcom,CC.DCB);
     CC.dcb.BaudRate := CBR_9600;
     CC.dcb.StopBits := TWOSTOPBITS;
     CC.dcb.ByteSize := 8;
     CC.dcb.Parity:=NOPARITY;
     SetCommState(hcom,CC.dcb);
     SetupComm(hcom,2048,2048);
     //设置超时
     shape1.Brush.Color := clGreen;
  end;
end;procedure TForm1.Button2Click(Sender: TObject);
var number,lperror : longword;
    temp: String;
    coms : Tcomstat;
    dwNumberOfBytesWritten,ErrorFlag,dwEvtMask: Dword;
begin
  FillChar(Wrlap,SizeOf(Wrlap),0);
  Wrlap.hEvent   :=   CreateEvent(nil,True,FALSE,nil);
  temp := memo1.Text ;//这里我输入 的是发短信的 AT命令 
  WriteFile(hcom,pchar(temp)^, length(temp),dwNumberOfBytesWritten,@Wrlap);
  ErrorFlag   := GetLastError;
    if   ErrorFlag=ERROR_IO_PENDING   then
        begin
          WaitForSingleObject(Wrlap.hEvent,1000);
        end
        else
        begin
          MessageBox(0,'WriteFile   Error!','Notice',MB_OK);
          Exit;
        end;end;procedure TForm1.Button3Click(Sender: TObject);var temp : String;
    lperror,dwNumberOfBytesRead : Longword;
    coms : Tcomstat;
    tmp : array [0..2047] of char;
begin
  ClearCommerror(hcom,lperror,@coms);
  FillChar(Rdlap,SizeOf(Rdlap),0);
  Rdlap.hEvent   :=   CreateEvent(nil,True,false,@Rdlap);
  lperror:=Getlasterror;
  IF NOT Readfile(hcom,tmp,coms.cbInQue,number,@Rdlap) Then
  begin
    if lperror = ERROR_IO_PENDING then
    begin;
    WaitForSingleObject(Rdlap.hEvent,1000);
    Getoverlappedresult(hcom,Rdlap.hEvent,dwNumberOfBytesRead,false);
    temp := copy(tmp,1,coms.cbInQue);
    end;
    memo2.Text := temp;
  end
  else
  memo2.Text := temp;
  purgeComm(hcom,PURGE_TXCLEAR or PURGE_RXCLEAR);
end;

解决方案 »

  1.   

    unit comdemou; 
    interface 
    uses 
    Windows, Messages, SysUtils, Classes, 
    Graphics, Controls, Forms, Dialogs; const 
    Wm_commNotify=Wm_User+12; 
    type 
    TForm1 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    private 
    Procedure comminitialize; 
    Procedure MsgcommProcess(Var 
    Message:Tmessage); Message Wm_commnotify; 
    { Private declarations } 
    public 
    { Public declarations } 
    end; //线程声明 
    TComm=Class(TThread) 
    protected 
    procedure Execute;override; 
    end; var 
    Form1: TForm1; 
    hcom,Post_Event:Thandle; 
    lpol:Poverlapped; 
    implementation {$R *.DFM} Procedure TComm.Execute; //线程执行过程 
    var 
    dwEvtMask:Dword; 
    Wait:Boolean; 
    Begin 
    fillchar(lpol,sizeof(toverlapped),0); 
    While True do Begin 
    dwEvtMask:=0; 
    Wait:=WaitCommEvent(hcom,dwevtmask,lpol); 
    //等待串行口事件; 
    if Wait Then Begin 
    waitforsingleobject(post_event,infinite); 
    //等待同步事件置位; 
    resetevent(post_event); //同步事件复位; 
    PostMessage(Form1.Handle, 
    WM_COMMNOTIFY,0,0);//发送消息; 
    end; 
    end; 
    end; procedure Tform1.comminitialize; 
    //串行口初始化 
    var 
    lpdcb:Tdcb; 
    Begin 
    hcom:=createfile('com2',generic_read or 
    generic_write,0,nil,open_existing, 
    file_attribute_normal or 
    file_flag_overlapped,0);//打开串行口 
    if hcom=invalid_handle_value then 
    else 
    setupcomm(hcom,4096,4096); 
    //设置输入,输出缓冲区皆为4096字节 
    getcommstate(hcom,lpdcb); 
    //获取串行口当前默认设置 
    lpdcb.baudrate:=2400; 
    lpdcb.StopBits:=1; 
    lpdcb.ByteSize:=8; 
    lpdcb.Parity:=EvenParity; //偶校验 
    Setcommstate(hcom,lpdcb); 
    setcommMask(hcom,ev_rxchar); 
    //指定串行口事件为接收到字符; 
    end; Procedure TForm1.Msgcomm 
    Process(Var Message:Tmessage); 
    var 
    Clear:Boolean; 
    Coms:Tcomstat; 
    cbNum,ReadNumber,lpErrors:Integer; 
    Read_Buffer:array[1..100]of char; 
    Begin 
    Clear:=Clearcommerror(hcom,lpErrors,@Coms); 
    if Clear Then Begin 
    cbNum:=Coms.cbInQue; 
    ReadFile(hCom,Read_Buffer, 
    cbNum,ReadNumber,lpol); 
    //处理接收数据 
    SetEvent(Post_Event); 
    //同步事件置位 
    end; 
    end; procedure TForm1.FormCreate(Sender: TObject); 
    begin 
    comminitialize; 
    post_event:=CreateEvent 
    (nil,true,true,nil); //创建同步事件; 
    Tcomm.Create(False); 
    //创建串行口监视线程; 
    end; end. 
      

  2.   

    楼上的谢谢你的回复,
    我连重叠I/O方式都没读到数据,监听的话也要用到 重叠I/O 噶