问题描述:基本上这是一个手机用COM串口通讯的来电显示程序,但是现在就是程序运行后,SETCOMMSTATE失败,跟踪后发现READFILE与WRITEFILE失败。但是如果手动运行WINDOWS的超级终端,并与手机连接,断开后,在运行程序,就能在MEMO中显示来电了,解决不了啊。各位大哥们帮忙啊,这是我工作叫给我的第一个问题。我是个新手,就靠各位大哥了!!!(部分代码没写进去,估计各位大哥也应该想的出来)    
部分代码如下
    procedure TForm1.Button1Click(Sender: TObject);
var
  lpdcb: TDCB;
  Ini: TIniFile;
  com: string;
  fdwattrsandflags:DWORD;
begin
  if Opened then
    Exit;
  Ini := TIniFile.Create(apppath + 'config.ini');  //  com:=Ini.ReadString('HW','Port','');
  //  IF com='' Then
  Com := ComboBox1.Text;
  ComboBox1.ItemIndex := ComboBox1.Items.IndexOf(COM);
    hCom := CreateFile(Pchar(ComboBox1.Text), generic_read or
    generic_write, 0, nil, open_existing,
    file_attribute_normal or
    file_flag_overlapped, 0);              
  if hCom = INVALID_HANDLE_VALUE then
    begin
      Ini.Free;
      Exit;
    end;  Opened := True;
    SetupComm(hCom,4096,4096); 
    PurgeComm(hCom,PURGE_RXCLEAR );
  GetCommState(hcom, lpdcb); 
      lpdcb.baudrate :=19200;
  lpdcb.StopBits := 1;
  lpdcb.ByteSize := 8;
    lpdcb.Parity:=NoParity;
  Setcommstate(hcom, lpdcb);
   
  SetcommMask(hcom, EV_RXCHAR); 
  Ini.WriteString('HW', 'PORT', ComboBox1.Text);
  Ini.Free;
  //SendCMD('AT+VCID=1');
  SendCMD('AT+CLIP=1');
end;
constructor TComThread.Create(Handle: DWORD; HWND: DWORD);
begin
  FhCom := Handle;
  FHWND := HWND;
  FExit := False;
  post_event:=CreateEvent(nil,true,true,nil); 
   read_os.hEvent:=CreateEvent(NIL,TRUE,true,NIL);
  write_os.hEvent:=CreateEvent(NIL,TRUE,true,NIL);
  read_os.Offset:=0;
  read_os.OffsetHigh:=0;
  write_os.Offset:=0;
  write_os.OffsetHigh:=0;
  inherited Create(False);
  FreeOnTerminate := True;
end;
procedure TComThread.Execute;     
var
  dwEvtMask: Dword;
  Wait: Boolean;
begin
  fillchar(lpol, sizeof(toverlapped), 0);
  while True do
    begin
      dwEvtMask := 0;
      Wait := WaitCommEvent(Fhcom, dwevtmask, nil); 
      if Wait then
        begin
          waitforsingleobject(post_event, infinite); 
          resetevent(post_event); 
          PostMessage(FHWND, WM_COMMNOTIFY, 0, 0); 
        end
      else
        Exit;
    end;
end;
procedure TForm1.SendCMD(CMD: string);
var
  Buffer: array[0..127] of char;
  cbNum: DWORD;
begin
  Fillchar(Buffer, 128, 0);
  CMD := CMD + #$0D#$0A;
  StrCopy(@Buffer, Pchar(CMD));
  fillchar(lpol, sizeof(toverlapped), 0);
  ComThread := TComThread.Create(hCom, Handle);
  WriteFile(hCom, Buffer, Length(CMD), cbNum, @lpol);
end;
procedure TForm1.MsgComProcess(var Message: Tmessage);
var
  Clear: Boolean;
  Coms: Tcomstat;
  cbNum, ReadNumber, lpErrors: DWORD;
  Read_Buffer: array[1..100] of char;
  iPos, Pos2: Integer;
  Num: Pchar;
  tmpstr: string;
begin
  Clear := Clearcommerror(hcom, lpErrors, @Coms);
  if Clear then                     
    begin
      cbNum := Coms.cbInQue;
      FillChar(Read_Buffer, 100, 0);
      Sleep(100);
      ReadFile(hCom, Read_Buffer, cbNum, ReadNumber, @lpol;
 SetEvent(Post_Event);  
    end;