我利用API函数进行串口编程,其中CreateFile()和ReadFile()都是采用异步方式,OVRELAPPED,在对串口读数据时使用了事件驱动的方式代码如下:
while(m_bExitThread == false)
{
m_comm1.WriteData("C",2);
SetCommMask(m_handle_1,EV_RXCHAR);
WaitCommEvent(m_handle_1,&dwEvtMask,NULL);
m_comm1.ReadData(result,len,10);
}
在执行WaitCommEvent()函数时如果没有数据应该在这里阻塞住,直到有数据到接收缓冲区,然后我去读缓冲区中的数据,现在的问题是明明已经通知我有数据到达了缓冲区,但读上来的字节数却是0!!!!!
看了MSDN,说WaitCommEvent()的第三个参数不能为NULL,否则会引起事件状态的混乱,那么又该如何设置这第三个参数呢?谢谢大家!能否给出一段代码!
while(m_bExitThread == false)
{
m_comm1.WriteData("C",2);
SetCommMask(m_handle_1,EV_RXCHAR);
WaitCommEvent(m_handle_1,&dwEvtMask,NULL);
m_comm1.ReadData(result,len,10);
}
在执行WaitCommEvent()函数时如果没有数据应该在这里阻塞住,直到有数据到接收缓冲区,然后我去读缓冲区中的数据,现在的问题是明明已经通知我有数据到达了缓冲区,但读上来的字节数却是0!!!!!
看了MSDN,说WaitCommEvent()的第三个参数不能为NULL,否则会引起事件状态的混乱,那么又该如何设置这第三个参数呢?谢谢大家!能否给出一段代码!
WaitCommEvent(m_handle_1,&dwEvtMask,&ol);
ovread.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL) ;if(WaitcommEvent(hComm, &dwEvent, &ovread))
if (dwEvent&EV_RXCHAR)
{
ClearCommError(hCom,&dwError, &cs) ;
while(cs.cbInQue>0)
{
if (!ReadFile(hCom,inbuff,cs.cbInQue, &nByteRead, &ov))
...
{
if (ERROR_IO_PENDING == GetLastError())
GetOverlappedresult(hCommDev, &ovread, &dwTransfer, TRUE) ;
}
if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)
{
...
{
Context *pContext=(Context*)lpData;
while(!pContext->bTerminateThread)
{
OVERLAPPED overlap;
DWORD bytesRead;
DWORD waitStatus;
BOOL readStatus;
memset(&overlap, 0, sizeof(OVERLAPPED));
overlap.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
readStatus = ReadFile(pContext->hDevice, pContext->pBuf, 9, &bytesRead, &overlap); // read data from device
if(readStatus) SetEvent(overlap.hEvent);
while(1)
{
waitStatus = WaitForSingleObject (overlap.hEvent, 1000 );
if(WAIT_OBJECT_0 == waitStatus) break;null jump loop
}
CloseHandle(overlap.hEvent); PostMessage(pContext->m_hWnd,WM_DISPLAY_READ_DATA,0,(LPARAM)pContext);
}
return 0;
}
{
HWND m_hWnd;
HANDLE hDevice;
BOOL bTerminateThread;
BYTE *pBuf; Context() // default value
{
bTerminateThread=FALSE;
hDevice=INVALID_HANDLE_VALUE;
}
};