Such code work
Code:
  DWORD dwRead = 0;
  while (!dwRead)
  {
   ClearCommError(h, &Err, &ComStat);
   dwRead = ComStat.cbInQue;
   Sleep(10);
  }
  DWORD dwRead2=0;
  while (dwRead != dwRead2)
  {
   dwRead2 = dwRead;
   ClearCommError(h, &Err, &ComStat);
   dwRead = ComStat.cbInQue;
   Sleep(10);    
  }
  hb->b = true;
  return;
Such code sometimes don't work:
Code:
 WaitCommEvent(h, &Mask, ReadOL);
  DWORD Signaled = WaitForSingleObject(ReadOL->hEvent, INFINITE);
  if (Signaled == WAIT_OBJECT_0)
	{
	  DWORD BytesTrans;
	  if (GetOverlappedResult(h, ReadOL, &BytesTrans, false))
	  {
        if (Mask & EV_RXCHAR)
		  { 
		    hb->ReadOL = ReadOL;
			hb->b = true;
                        ReadFile(hComPort, buff_read, min(dwRead, 256), &tmpBytesRead, ReadOL)// Or          //                                                                                                                      NULL also don't work
//                                                                                                                         correctly...
			CloseHandle(ReadOL->hEvent);
		}
	  }
    }
And is it correctly to use first snippet?