if f_COM_HWD = INVALID_HANDLE_VALUE then
  begin
  f_COM_HWD :=   CreateFile(PCHAR(f_ComportParam.GetData_String('COM_NAME')),GENERIC_READ or GENERIC_WRITE,0,nil,
                                 OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL ,0);
     if f_COM_HWD = INVALID_HANDLE_VALUE then  Exit;
    SetupComm(f_COM_HWD, BUFFER_MAXNUM, BUFFER_MAXNUM);
   GetCommState( f_COM_HWD, DcbInfo );
  BuildCommDCB(PCHAR(f_ComportParam.GetData_String('COM_PARAMS')),DcbInfo );
  SetCommState( f_COM_HWD, DcbInfo );    CommTimeout.ReadIntervalTimeout := 10;
    CommTimeout.ReadTotalTimeoutMultiplier := 10;
    CommTimeout.ReadTotalTimeoutConstant := 10;
    CommTimeout.WriteTotalTimeoutMultiplier := 10;
    CommTimeout.WriteTotalTimeoutConstant := 10;
    SetCommTimeouts(f_COM_HWD, CommTimeout); 
    PurgeComm(f_COM_HWD,PURGE_RXCLEAR or PURGE_TXCLEAR);
    IsOpend := TRUE;
  end;串口初始化函数如上,设置了Read超时确没有效果,再调用ReadFile时就死住,必须收到消息才能继续(这影响了我的其他操作)请问怎么样才能ReadFile超时就结束啊

解决方案 »

  1.   

    顺便把我接收函数也发上来if( ReadFile(f_COM_HWD, RevBuf, BUFFER_MAXNUM, dwLen, nil)) then
      begin
         RevData := '';
         for I := 1 to dwLen do
           RevData := RevData+ CHR(RevBuf[I-1]);
        Result := RevData;
      end;
      

  2.   

    仔细研究下ReadFile的函数返回内容,你简单用个if判断明显不合理,ReadFile不应该返回的是Bool类型吧,比如网络的就有很多返回,另外出了错误,应该还有类似GetLastError的函数来分析使用,你写的这个通信方面的程序,只判断成功和失败这样肯定不够的。另外你说的问题,是不是还可以看看有没有异步的函数可用,复杂度提高,但是绝对不会造成程序其他模块无法工作,到底用同步还是异步,要根据具体情况看。