方法不对。请问你用的是NT,还是WINDOWS 9X?在NT下,必须使用读事件,否则返回错误。具体的方法,请看下面的读串口的原码:   COMSTAT    ComStat ;
   DWORD      dwErrorFlags;
   DWORD      dwLength;
   OVERLAPPED os_read;   os_read.hEvent = CreateEvent( NULL,    // no security
     TRUE,    //  explicit reset req
                                FALSE,   // initial event reset
     NULL ) ; // no name
if (os_read.hEvent == NULL) return -1;   // only try to read number of bytes in queue
   ClearCommError( hCom, &dwErrorFlags, &ComStat ) ;   if(!ReadFile( hCom, lpszBlock, nMaxLength, &dwLength, &os_read)) {
      if (GetLastError() == ERROR_IO_PENDING) {
         // We have to wait for read to complete.
         // This function will timeout according to the
         // CommTimeOuts.ReadTotalTimeoutConstant variable
         // Every time it times out, check for port errors
         while(!GetOverlappedResult( hCom, &os_read, &dwLength, TRUE )) {
            if(GetLastError() != ERROR_IO_INCOMPLETE) {
               ClearCommError( hCom, &dwErrorFlags, &ComStat ) ;
               break;
            }
         }
      }
      else {
         // some other error occurred
         dwLength = -1 ;
         ClearCommError( hCom, &dwErrorFlags, &ComStat ) ;
      }
   }
   CloseHandle(os_read.hEvent);
   return ( dwLength ) ;