// 工作者线程,负责监视串行口
UINT CommProc(LPVOID pParam)
{
OVERLAPPED os;
DWORD dwMask, dwTrans;
COMSTAT ComStat;
DWORD dwErrorFlags; CTTYDoc *pDoc=(CTTYDoc*)pParam; memset(&os, 0, sizeof(OVERLAPPED));
os.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);//无信号的 if(os.hEvent==NULL)
{
AfxMessageBox("Can't create event object!");
return (UINT)-1;
} while(pDoc->m_bConnected)
{
ClearCommError(pDoc->m_hCom,&dwErrorFlags,&ComStat); if(ComStat.cbInQue)
{
// 无限等待WM_COMMNOTIFY消息被处理完
WaitForSingleObject(pDoc->m_hPostMsgEvent, INFINITE);
ResetEvent(pDoc->m_hPostMsgEvent); // 通知视图
PostMessage(pDoc->m_hTermWnd, WM_COMMNOTIFY, EV_RXCHAR, 0); continue;
} dwMask=0; if(!WaitCommEvent(pDoc->m_hCom, &dwMask, &os)) // 重叠操作
{ if(GetLastError()==ERROR_IO_PENDING)
// 无限等待重叠操作结果
GetOverlappedResult(pDoc->m_hCom, &os, &dwTrans, TRUE);
else
{
CloseHandle(os.hEvent);
return (UINT)-1;
}
}
} CloseHandle(os.hEvent);
return 0;
}   此函数中的WaitCommEvent(pDoc->m_hCom, &dwMask, &os // 重叠操作,
等待发生的事件, 我怎么没有找到呢?还有OVERLAPPED结构中的最后一个参数,os.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);//无信号的
这个事件是不是不需要我来控制呢?
当发生了一个EV_RXCHAR事件,我该怎么办呢?
我怎么知道这个事件发生了呢?WaitCommEvent这个函数好像没有告诉我啊!
  现在是程序设计的攻关阶段,请高手帮忙解决呀

解决方案 »

  1.   

    WaitCommEvent是等待某个事件的发生,使用SetCommEvent设置等待事件。
    如:SetCommEvent(pDoc->m_hComm, EV_RXCHAR);//设置等待收到字符的事件
        os.hEvent= CreateEvent(NULL, TRUE, FALSE, NULL);//创建手工重置的无信号事件
        WaitCommEvent(pDoc->m_hComm, &dwMask, &os);
    当程序运行到WaitCommEvent,它会马上返回(overlapped),然后到发生了EV_RXCHAR时,会
    将刚才的Event对象设置为有信号。
        你可以使用WaitForSingleObject等待这个Event,当它返回WAIT_OBJECT_0(成功返回)
    时开始接收数据。接收完数据后如须再次等待EV_RXCHAR事件,必须调用ResetEvent将Event设
    为无信号。