在VC 6.0中用Win32API实现串行通信(3)

2008-04-09 04:10:08来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折


 if(m_rdos.hEvent == NULL)
  return FALSE;
 m_wtos.Offset = 0;
 m_wtos.OffsetHigh = 0;
 m_wtos.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
 if(m_wtos.hEvent == NULL)
 {
  CloseHandle(m_rdos.hEvent);
  return FALSE;
 }

 wsprintf(csCom,"COM%d",m_bComId);

 m_hCom = CreateFile(csCom,GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING,ILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,NULL);

 if(m_hCom == INVALID_HANDLE_VALUE) {
  //dwError = GetLastError();
  // handle error
  return FALSE;
 }
 else
 {
  SetCommMask( m_hCom, EV_RXCHAR ) ; // get any early notifications
  SetupComm( m_hCom, 4096, 4096 ) ; // setup device buffers
  // purge any information in the buffer

  PurgeComm( m_hCom, PURGE_TXABORT | PURGE_RXABORT |PURGE_TXCLEAR | PURGE_RXCLEAR ) ;

  // set up for overlapped I/O

  DWORD dwTemp = 1000 / (this->m_dwBaudRate / 8);
  CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF ;
  CommTimeOuts.ReadTotalTimeoutMultiplier = 0;//((dwTemp > 0) ? dwTemp : 1);
  CommTimeOuts.ReadTotalTimeoutConstant = 1000 ;

  // CBR_9600 is approximately 1byte/ms. For our purposes, allow
  // double the expected time per character for a fudge factor.

  CommTimeOuts.WriteTotalTimeoutMultiplier =2*CBR_9600/this->m_dwBaudRate;//( npTTYInfo ) ;
  CommTimeOuts.WriteTotalTimeoutConstant = 0;//1000 ;

  SetCommTimeouts( m_hCom, &CommTimeOuts ) ;
 }
 if(!SetupConnection())
 {
  CloseConnection();
  return FALSE;
 }
 EscapeCommFunction( m_hCom, SETDTR );
 m_bConnected = TRUE;
 return TRUE;
}

BOOL CComStatus::CloseConnection()
{
 if (NULL == m_hCom)
  return ( TRUE ) ;
 // set connected flag to FALSE
 m_bConnected = FALSE;
 // disable event notification and wait for thread
 // to halt
 SetCommMask( m_hCom, 0 ) ;
 EscapeCommFunction( m_hCom, CLRDTR ) ;
 // purge any outstanding reads/writes and close device handle
 PurgeComm( m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
 CloseHandle( m_hCom ) ;
 m_hCom = NULL;

 // change the selectable items in the menu

 CloseHandle(m_rdos.hEvent);
 CloseHandle(m_wtos.hEvent);
 return ( TRUE ) ;
}

BOOL CComStatus::SetupConnection()
{
 BOOL fRetVal ;
 BYTE bSet ;
 DCB dcb ;
 if(m_hCom == NULL)
  return FALSE;
 dcb.DCBlength = sizeof( DCB ) ;
 GetCommState( m_hCom, &dcb ) ;
 dcb.BaudRate = this->m_dwBaudRate;
 dcb.ByteSize = this->m_bByteSize;
 dcb.Parity = this->m_bParity;
 dcb.StopBits = this->m_bStopBits ;
 dcb.EvtChar = this->m_bEvtChar ;
 // setup hardware flow control
 bSet = (BYTE) ((m_bFlowCtrl & FC_DTRDSR) != 0) ;
 dcb.fOutxDsrFlow = bSet ;
 if (bSet)
  dcb.fDtrControl = DTR_CONTROL_HANDSHAKE ;
 else
  dcb.fDtrControl = DTR_CONTROL_ENABLE ;
 bSet = (BYTE) ((m_bFlowCtrl & FC_RTSCTS) != 0) ;
 dcb.fOutxCtsFlow = bSet ;
 if (bSet)
  dcb.fRtsControl = RTS_CONTROL_HANDSHAKE ;
 else
  dcb.fRtsControl = RTS_CONTROL_ENABLE ;
 // setup software flow control
 bSet = (BYTE) ((m_bFlowCtrl & FC_XONXOFF) != 0) ;
 dcb.fInX = dcb.fOutX = bSet ;
 dcb.XonChar = ASCII_XON ;
 char xon = ASCII_XON ;
 dcb.XoffChar = ASCII_XOFF ;
 char xoff = ASCII_XOFF ;
 dcb.XonLim = 100 ;
 dcb.XoffLim = 100 ;
 // other various settings
 dcb.fBinary = TRUE ;
 dcb.fParity = TRUE ;
 fRetVal = SetCommState( m_hCom, &dcb ) ;
 return ( fRetVal ) ;
} // end of SetupConnection()

BOOL CComStatus::IsConnected()
{
 return m_bConnected;
}

UINT CommWatchProc( LPVOID lpData )
{
 DWORD dwEvtMask ;
 //NPTTYINFO npTTYInfo = (NPTTYINFO) lpData ;
 OVERLAPPED os ;
 int nLength ;
 //BYTE abIn[ MAXBLOCK 1] ;

 CComStatus * pCom = (CComStatus *)lpData;
 memset( &os, 0, sizeof( OVERLAPPED ) ) ;
 // create I/O event used for overlapped read

 os.hEvent = CreateEvent( NULL, // no security
  TRUE, // explicit reset req
  FALSE, // initial event reset
  NULL ) ; // no name

 if (os.hEvent == NULL)
 {
  MessageBox( NULL, "Failed to create event for thread!", "TTY Error!",MB_ICONEXCLAMATION | MB_OK ) ;
  return ( FALSE ) ;
 }
 if (!SetCommMask( pCom->m_hCom, EV_RXCHAR ))
  return ( FALSE ) ;
 char buf[256];
 while ( pCom->m_bConnected )
 {
  dwEvtMask = 0 ;
  WaitCommEvent( pCom->m_hCom, &dwEvtMask, NULL );
  if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)
  {
   if ((nLength = ReadCommBlock( *pCom, (LPSTR) buf, 255 )))
   {
    //WriteTTYBlock( hTTYWnd, (LPSTR) abIn, nLength ) ;
    buf[nLength]='\0';
    AfxMessageBox(buf);
   }
  }
 }
 CloseHandle( os.hEvent ) ;
 return( TRUE ) ;
} // end of CommWatchProc()

int ReadCommBlock(CComStatus& comDev,LPSTR lpszBlock, int nMaxLength )

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:微软VisualStudio2005开发工具路线图详解

下一篇:用VisualC 实现屏幕抓图程序