/************************************************************************
* Nom de la fonction : Open *
* En entrée : *
* Numero de port série *
* Vitesse de transmission (en bauds) *
* *
* En sortie : *
* TRUE si l'ouverture du port s'est bien passée *
* FALSE si problème dans l'ouverture du port *
* *
* Description : Ouverture du port de transmission *
*************************************************************************/
char szPort[15];
char szComParams[50];
DCB dcb;
BOOL CSerial::Open( int nPort, int nBaud )
{
COMMTIMEOUTS CommTimeOuts;
unsigned char ucSet;
if( m_bOpened )
return( TRUE );
wsprintf( szPort, "COM%d", nPort );
// Ouverture de la communication au port série
// On récupère le handle
m_hIDComDev = CreateFile( szPort,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
NULL );
if( m_hIDComDev == INVALID_HANDLE_VALUE )
return( FALSE );
//--- Dimensionne les buffers d'entrée et sortie.
if ( !SetupComm(m_hIDComDev, 10000, 10000) )
return false;
if(GetCommTimeouts(m_hIDComDev, &CommTimeOuts))
{
CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = 0;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 10000;
}
if(!SetCommTimeouts( m_hIDComDev, &CommTimeOuts ))
return( FALSE );
memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );
memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );
m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
m_OverlappedWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
dcb.DCBlength = sizeof( DCB );
if(!GetCommState( m_hIDComDev, &dcb ))
return ( FALSE );
dcb.BaudRate = nBaud; //1200 bauds
dcb.ByteSize = 7; //7 bits
dcb.StopBits = ONESTOPBIT; //1 stop
dcb.Parity = EVENPARITY; //Parity EVEN
dcb.fParity=true;
dcb.fDtrControl= DTR_CONTROL_DISABLE; //-5 sur la broche DTR pour commutation de la boîte
ucSet = (unsigned char) ( ( FC_RTSCTS & FC_DTRDSR ) != 0 );
ucSet = (unsigned char) ( ( FC_RTSCTS & FC_RTSCTS ) != 0 );
ucSet = (unsigned char) ( ( FC_RTSCTS & FC_XONXOFF ) != 0 );
if( !SetCommState( m_hIDComDev, &dcb ) ||
m_OverlappedRead.hEvent == NULL || m_OverlappedWrite.hEvent == NULL )
{
DWORD dwError = GetLastError();
if( m_OverlappedRead.hEvent != NULL )
CloseHandle( m_OverlappedRead.hEvent );
if( m_OverlappedWrite.hEvent != NULL )
CloseHandle( m_OverlappedWrite.hEvent );
CloseHandle( m_hIDComDev );
return( FALSE );
}
m_bOpened = TRUE;
return( m_bOpened );
}
Partager