serial port Writefile: sometimes 998 ERROR_NOACCESS
Hi,
I`ve noticed an 998 ERROR_NOACCESS error during a WriteFile method.
This error occurs only sometimes - e.g. after 15min where the prog is
running without problems...
I`m not sure, because the explanation of this error is pretty small,
to which memory I didn`t have an access (to the memory with the data
writing to the serial port | or to the serial-port handle)?
If installed two threads, one who is responsible for collecting the
data to tx by the com port and another thread which will transmit
these data. As data I`m using a huge CByteArray located at the heap.
//Data to tx by usb
void CASoc::RxData(ADATA *ptr)
{
CByteArray *pData = new CByteArray;
pData->SetSize(SIZE_OF_ARRAY);
memcpy(pData->GetData(), &ptr->Data[0], SIZE_OF_ARRAY);
::PostThreadMessage(m_ThreadIDs[0], UWM_GET_NEW_DATA,(WPARAM)pData,
SIZE_OF_ARRAY);
}
//thread which collects these data into a clist queue (according to
the example queue from Mr. Newcomer)
void CDmxCollectThread::OnGetNewData(WPARAM wParam, LPARAM lParam)
{
TRACE(_T("collect thread: new data\n"));
CByteArray *pData = (CByteArray *)wParam;
//collect them in a list or queue
if(!q.AddTail(pData))
{ /* failed */
TRACE(_T("queue is full\n"));
delete pData;
return;
} /* failed */
else
{
//show size of queue
TRACE(_T("queue size: %d\n"), q.GetSize());
long n = InterlockedIncrement(&count);
}
}
//thread which will tx these data
void CDmxWriterThread::WriteData(Queue *q)
{
BOOL running = TRUE;
DWORD bytesWritten;
OVERLAPPED ovl = {0};
ovl.hEvent = WriteEvent;
/* writer thread */
while(running)
{
//check if shutdown event occurred
DWORD result = ::WaitForSingleObject(ShutdownEvent, 1); //wenn dann
multiple object
switch(result)
{ /* result */
case WAIT_OBJECT_0:
//shutdown event occure
::CancelIo(hCom);
//nur wenn daten available sind, ist die map noch nicht gel=F6scht!
while(q->GetSize() > 0)
{
LPVOID p =q->RemoveHead();
CByteArray *pData = (CByteArray *) p;
delete pData;
}
PostQuitMessage(0);
running = FALSE;
default:
//go ahead if no shutdown event occurred
break;
}
//check if new data available in the queue
if(q->GetSize() == 0)
continue;
else
{
LPVOID p = q->RemoveHead();
long n = InterlockedDecrement(pcnt);
CByteArray *pData = (CByteArray *) p;
UINT count = pData->GetCount();
UINT size = pData->GetSize();
BOOL ok = ::WriteFile(hCom, // handle
pData, // 8-bit data
pData-
GetSize(), // length
&bytesWritten, // amount written
&ovl); // overlapped structure
if(!ok)
{ /* failed */
DWORD err = ::GetLastError();
if(err != ERROR_IO_PENDING)
{ /* serious error */
/* sometimes a serious error 998 (GestLastError()) occurred */
=09
AfxMessageBox(_T("serious error\n"));
delete pData;
return;
}
//transfer is pending
// By using WFMO and having the shutdown event be first, this
allows us
// to break out of the wait to shut the thread down cleanly
HANDLE waiters[2];
waiters[0] = ShutdownEvent;
waiters[1] = WriteEvent;
DWORD reason = ::WaitForMultipleObjects(2, waiters, FALSE,
INFINITE);
switch(reason)
{ /* waitfor */
case WAIT_OBJECT_0: // it was the shutdown event
// shutting down
delete pData;
return;
case WAIT_OBJECT_0 + 1:
// data complete
{ /* write complete */
BOOL ok = ::GetOverlappedResult(hCom, &ovl, &bytesWritten, TRUE);
if(!ok)
{ /* failed */
//parms->notifyee->PostMessage(UWM_WRITER_SHUTTING_DOWN,
(WPARAM)::GetLastError());
//PostQuitMessage(0);
//delete s;
DWORD err = ::GetLastError();
delete pData;
return;
} /* failed */
//delete s;
} /* write complete */
break;
default:
{ /* trouble */
DWORD err = ::GetLastError();
ASSERT(FALSE);
//parms->notifyee->PostMessage(UWM_WRITER_SHUTTING_DOWN,
(WPARAM)err);
//PostQuitMessage(0);
delete pData;
return;
} /* trouble */
}
}
else
{ /* successful write */
delete pData;
TRACE(_T("successfull written to the lpc\n"));
} /* successful write */
}
}
}
I didn`t code the last part of this function (after the "serious error
section" so far, because it is never called (at the moment)...
best regards
Hans