[C++] WaitCommEvent

Résolu/Fermé
skarsnick Messages postés 79 Date d'inscription jeudi 15 mars 2007 Statut Membre Dernière intervention 17 décembre 2009 - 27 avril 2007 à 11:20
skarsnick Messages postés 79 Date d'inscription jeudi 15 mars 2007 Statut Membre Dernière intervention 17 décembre 2009 - 27 avril 2007 à 16:02
Bonjour :)
J'ai un p'tit soucis que j'ai assez bien cerné mais je ne vois pas comment passé outre

Voilà mon code:

void CS8Dlg::initialisation() 
{
	HANDLE hCom1,hCom4; 
	OVERLAPPED o,q; 
	DWORD dwEvtMask1,dwEvtMask4; 
	DCB dcb; 
	BOOL fSuccess1,fSuccess4; 

		// OPEN THE SERIAL 1
hCom1 = CreateFile( 
	TEXT("COM1"),
	GENERIC_READ | GENERIC_WRITE, 
	0, 							// must be opened with exclusive-access 
	NULL, 						// default security attributes 
	OPEN_EXISTING,				// must use OPEN_EXISTING
	0, 							// not overlapped I/O 
	NULL 						// hTemplate must be NULL for comm devices 
	);

		// OPEN THE SERIAL 4
hCom4 = CreateFile( 
	TEXT("COM4"), 
	GENERIC_READ | GENERIC_WRITE, 
	0, 							// must be opened with exclusive-access 
	NULL, 						// default security attributes 
	OPEN_EXISTING,				// must use OPEN_EXISTING
	0, 							// not overlapped I/O 
	NULL 						// hTemplate must be NULL for comm devices 
	);

if (hCom1 == INVALID_HANDLE_VALUE || hCom4 == INVALID_HANDLE_VALUE ) 
	{ 
		return; // You're divises are not correctly linked
	} 

SetupComm(hCom1,5000,5000); 
SetupComm(hCom4,5000,5000); 

fSuccess1 = GetCommState(hCom1, &dcb); 
fSuccess4 = GetCommState(hCom4, &dcb); 

if (!fSuccess1 || !fSuccess4) 
	{
		return; // No communication with your modules
	} 

	// CONFIGURE THE SERIAL COMMUNICATION

	// Fill in DCB: 9	,600 bps, 8 data bits, no parity, and 1 stop bit. 
dcb.BaudRate = CBR_9600;		// set the baud rate 
dcb.ByteSize = 8;				// data size, xmit, and rcv 
dcb.Parity   = NOPARITY;		// no parity bit 
dcb.StopBits = ONESTOPBIT;		// one stop bit 
dcb.fNull=FALSE;
dcb.fRtsControl=RTS_CONTROL_ENABLE;
dcb.fInX=FALSE;
dcb.fOutX=FALSE;
dcb.fDtrControl=DTR_CONTROL_ENABLE; 

SetCommState(hCom1,&dcb); 
SetCommState(hCom4,&dcb); 
if (!SetCommState(hCom1,&dcb) || !SetCommState(hCom4,&dcb))
	{
		return; //Problem with the configuration of the serial communication
	} 


fSuccess1 = SetCommMask(hCom1, EV_DSR); 
fSuccess4 = SetCommMask(hCom4, EV_DSR); 
if (!fSuccess1 || !fSuccess4) 
	{ 
		return; // Problem with the actual states of the modules
	} 


// Create an event object for use by WaitCommEvent. 
o.hEvent = CreateEvent( 
NULL,	// default security attributes 
TRUE,	// manual-reset event 
FALSE,	// not signaled 
NULL	// no name 
); 
// Create an event object for use by WaitCommEvent. 
q.hEvent = CreateEvent( 
NULL,	// default security attributes 
TRUE,	// manual-reset event 
FALSE,	// not signaled 
NULL	// no name 
); 


// Initialize the rest of the OVERLAPPED structure to zero. 
 o.Internal = 0;
 o.InternalHigh = 0;
 o.Offset = 0;
 o.OffsetHigh = 0;
 assert(o.hEvent);
 	
 // Initialize the rest of the OVERLAPPED structure to zero. 
 q.Internal = 0;
 q.InternalHigh = 0;
 q.Offset = 0;
 q.OffsetHigh = 0;
 assert(q.hEvent);

 if (WaitCommEvent(hCom1, &dwEvtMask1, &o) || WaitCommEvent(hCom4, &dwEvtMask4, &q)) 
	{
 	if (dwEvtMask1 & EV_DSR) 
		{ 
	//DO UN TRUC
		} 
	if (dwEvtMask4 & EV_DSR) 
		{ 
	//DO UN autre TRUC
		} 
	}
	return;
}


Mon problème et vous l'aurez peut être compris, c'est que mon if (WaitCommEvent || WaitCommEvent) dès qu'un des deux évènements se passe (soit sur COM 1 soit sur COM 4) il s'arrête sur le premier if.
En faite j'aimerais qu'ils attendent un évènement de la part de COM 1 ou COM 4 et qu'une fois que l'évènement a eu lieu, qu'il test if (dwEvtMask1 & EV_DSR) ET if (dwEvtMask4 & EV_DSR)
bref quand je titille mon COM 1 il DO UN TRUC, quand je titille mon COM 4 il attend bêtement au niveau du if (dwEvtMask1 & EV_DSR) ...

J'ai peur de devoir utiliser un thread :(

Une idée ?
Merci:)

1 réponse

skarsnick Messages postés 79 Date d'inscription jeudi 15 mars 2007 Statut Membre Dernière intervention 17 décembre 2009 59
27 avril 2007 à 16:02
le problème est ici:

if (WaitCommEvent(hCom1, &dwEvtMask1, &o) || WaitCommEvent(hCom4, &dwEvtMask4, &q))

en attendant l'évènement du COM 1, le proc ne regarde pas l'état du port 4, il se bloque sur son observation du COM1, donc il ne faut pas les mettre dans le même if,
un thread me semble la seule solution
0