shubha_mohan
asked on
Waitforsingleobject always results in a timeout !!!
My waitforsingleobject always results in a timeout and i am unable to figure out why.. Please look at my code below..
i have a read file call .that gets called as soon as i receive a character in the input buffer. Hence i am waiting on waitcommevent and when a character appears, i issue a readfile to read all the characters that have come through my serial port.. However, waitcommevent is a blocking call. I had to make the waitcommevent timeout.. Hence, i moved to overlapped IO. But now..my waitcommevent always timeouts even though i know that there are characters to read. Please let me know what is wrong with my code..
/************************* ********** ********** ********** ********** ********** ********** ********/
int ReadProc1(char *str)
{
/*
Using the EV_RXCHAR flag will notify the thread that a byte arrived at the port. This event,
used in combination with the ReadFile function, enables a program to read data only after
it is in the receive buffer, as opposed to issuing a read that waits for the data to arrive*/
DWORD dwCommEvent; //a variable that receives a mask indicating the type of event that occurred
char chRead; // Character read every time a read takes place.
DWORD dwRead =0,Err,Bytes; //Pointer to the variable that receives the number of bytes read
char * str =calloc(100,sizeof(char));
unsigned int i=0,j=2;
BOOL fWaitingOnRead = FALSE,Ok= FALSE;
OVERLAPPED osReader= {0};
FillMemory(str, strlen(str), 0);
//if((strcmp(p->PType,"13" ) == 0) && (strcmp(p->Data,"0") != 0)) stop = 0x06;
if (stop == 0x06) terminate=1;
if (stop == 0x03) terminate=0;
memset(&osReader,0,sizeof( OVERLAPPED ));
osReader.hEvent = CreateEvent(
NULL, // no security attributes
TRUE, // auto reset event
FALSE, // not signaled
NULL // no name
);
if (osReader.hEvent == NULL)
{
LogEvent(hComm,"Error creating overlapped event");
}
for ( ; ; ) {
if (!fWaitingOnRead)
{
if (!(WaitCommEvent(hComm, &dwCommEvent,&osReader)))
{
if (GetLastError() != ERROR_IO_PENDING)
{
LogEvent (ghwnd," Error in Wait Comm Event");
return FALSE;
}
else
{
fWaitingOnRead = TRUE;
Err = WaitForSingleObject(hComm, READ_TIMEOUT);
switch(Err)
{
case WAIT_TIMEOUT:
LogEvent(ghwnd,"Timed out waiting for response from device.. check connections/power");
return FALSE;
break;
case WAIT_OBJECT_0:
// Event triggered. Check the status.
Ok = GetOverlappedResult(hComm, &osReader, &Bytes, TRUE);
if (Ok)
{
do
{
if (ReadFile(hComm, &chRead, 1, &dwRead, NULL))
{
// A byte has been read; process it.
str[i++]=chRead;
}
else
{
// An error occurred in the ReadFile call.
LogEvent(ghwnd," Read Failed With Error Code ");
break;
}
} while (dwRead );
}
else
{
LogEvent(ghwnd,"Get Overlapped Result Failed ");
return FALSE;
}
break;
default:
LogEvent (ghwnd," Error in wait for single object");
return FALSE;
break;
}//End of Switch
}//End of GetLastError
}
else
{
LogEvent(ghwnd,"Read Completed Immedialtely");
/* So Proceed to readfile
}//End of Wait Comm Event
}// End of Waiting on Read
}
}
/************************* ********** ********** ********** ********** ********** ********** ********
i have a read file call .that gets called as soon as i receive a character in the input buffer. Hence i am waiting on waitcommevent and when a character appears, i issue a readfile to read all the characters that have come through my serial port.. However, waitcommevent is a blocking call. I had to make the waitcommevent timeout.. Hence, i moved to overlapped IO. But now..my waitcommevent always timeouts even though i know that there are characters to read. Please let me know what is wrong with my code..
/*************************
int ReadProc1(char *str)
{
/*
Using the EV_RXCHAR flag will notify the thread that a byte arrived at the port. This event,
used in combination with the ReadFile function, enables a program to read data only after
it is in the receive buffer, as opposed to issuing a read that waits for the data to arrive*/
DWORD dwCommEvent; //a variable that receives a mask indicating the type of event that occurred
char chRead; // Character read every time a read takes place.
DWORD dwRead =0,Err,Bytes; //Pointer to the variable that receives the number of bytes read
char * str =calloc(100,sizeof(char));
unsigned int i=0,j=2;
BOOL fWaitingOnRead = FALSE,Ok= FALSE;
OVERLAPPED osReader= {0};
FillMemory(str, strlen(str), 0);
//if((strcmp(p->PType,"13"
if (stop == 0x06) terminate=1;
if (stop == 0x03) terminate=0;
memset(&osReader,0,sizeof(
osReader.hEvent = CreateEvent(
NULL, // no security attributes
TRUE, // auto reset event
FALSE, // not signaled
NULL // no name
);
if (osReader.hEvent == NULL)
{
LogEvent(hComm,"Error creating overlapped event");
}
for ( ; ; ) {
if (!fWaitingOnRead)
{
if (!(WaitCommEvent(hComm, &dwCommEvent,&osReader)))
{
if (GetLastError() != ERROR_IO_PENDING)
{
LogEvent (ghwnd," Error in Wait Comm Event");
return FALSE;
}
else
{
fWaitingOnRead = TRUE;
Err = WaitForSingleObject(hComm,
switch(Err)
{
case WAIT_TIMEOUT:
LogEvent(ghwnd,"Timed out waiting for response from device.. check connections/power");
return FALSE;
break;
case WAIT_OBJECT_0:
// Event triggered. Check the status.
Ok = GetOverlappedResult(hComm,
if (Ok)
{
do
{
if (ReadFile(hComm, &chRead, 1, &dwRead, NULL))
{
// A byte has been read; process it.
str[i++]=chRead;
}
else
{
// An error occurred in the ReadFile call.
LogEvent(ghwnd," Read Failed With Error Code ");
break;
}
} while (dwRead );
}
else
{
LogEvent(ghwnd,"Get Overlapped Result Failed ");
return FALSE;
}
break;
default:
LogEvent (ghwnd," Error in wait for single object");
return FALSE;
break;
}//End of Switch
}//End of GetLastError
}
else
{
LogEvent(ghwnd,"Read Completed Immedialtely");
/* So Proceed to readfile
}//End of Wait Comm Event
}// End of Waiting on Read
}
}
/*************************
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.