Problème avec port Série sur Win XP
Je travaille en ce moment sur un projet qui etablie une communication entre un pc sur WIn 98 et un periphérique par le port série.
En migrant l'application VS C++ sur WIn XP je me rends compte que ca ne fonctionne plus.
En gros j'établie une connection Asynchrone, j'envois une requète et je recupère la réponse.
Donc la connexion s'établie bien comme sur windows 98, j'envois ma chaine de carcatère avec WriteFile, ca à l'air de fontionner, mais le périphérique me renvoit rien, je ne recupère rien avec la ocmmande ReadFile.
J'ai fait une méthode simple qui regroupe tout ca, je l'ai testé sur 98 ca fonctionne mais pas sur XP.
J'ai deja établi beaucoup de recherche sur le net mais je ne trouve pas la solution.
Voila mon code pour la connexion
Citation:
/************************************************************************
* 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 );
}
La méthode qui ecrit et lit (qui ne fonctionne pas)
Citation:
void CSerial::TestConnect()
{
DWORD nbr_octet_lu = 0;
DWORD nbr_octet_ecrit = 0;
char ucByte[100];
memset (ucByte,0,sizeof(ucByte));
strcpy(ucByte,"/?!**");
ucByte[3]=CR;
ucByte[4]=LF;
int bWriteStat = WriteFile( m_hIDComDev, ucByte, 5 , &nbr_octet_ecrit, &m_OverlappedWrite );
int dwWait = WaitForSingleObject( m_OverlappedWrite.hEvent, 1000 );
if ((dwWait == WAIT_FAILED) || (dwWait == WAIT_TIMEOUT))
{
if (dwWait == WAIT_FAILED)
return;
}
if(!GetOverlappedResult( m_hIDComDev, &m_OverlappedWrite, &nbr_octet_ecrit, FALSE ))
return;
else
m_OverlappedWrite.Offset += nbr_octet_ecrit;
memset (ucByte,0,sizeof(ucByte));
while(1)
{
int bReadStatus = ReadFile( m_hIDComDev, ucByte, 20, &nbr_octet_lu, &m_OverlappedRead);
//if (strcmp(ucByte,""))
if (*ucByte != 0 || nbr_octet_lu > 0 || strcmp(ucByte,""))
break;
dwWait = WaitForSingleObject( m_OverlappedRead.hEvent, 500 );
if ((dwWait == WAIT_FAILED) || (dwWait == WAIT_TIMEOUT))
{
if (dwWait == WAIT_FAILED)
return;
}
}
if (!GetOverlappedResult(m_hIDComDev, &m_OverlappedRead,&nbr_octet_lu, FALSE))
return;
}