我利用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,否则会引起事件状态的混乱,那么又该如何设置这第三个参数呢?谢谢大家!能否给出一段代码!

解决方案 »

  1.   

    定义WSAOVERLAPPED ol;
    WaitCommEvent(m_handle_1,&dwEvtMask,&ol);
      

  2.   

    CreateEventA 有没有 问题
      

  3.   

    OVERLAPPED ovread ;memset( &ovread, 0x00, sizeof(OVERLAPPED) ) ;
    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))
     ...
      

  4.   

    to shanhe972005 兄弟!我觉得如果WaitcommEvent()的阻塞状态被解除那么一定有字符到了接收缓冲区中,cs.cbInQue一定会大于0,一定会接收到字符的!可是实际上我在实验中经常发现cs.cbInQue=0,那么事件驱动还有什么意义啊!另外,&ovread在程序中只这么用就可以了吗?后边不要什么关于它的代码了吧!
      

  5.   

    if (!WaitCommEvent(hCommDev, &dwEvtMask, &ovread))
    {
         if (ERROR_IO_PENDING == GetLastError())
    GetOverlappedresult(hCommDev, &ovread, &dwTransfer, TRUE) ;
    }
    if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)
    {
     ...
      

  6.   

    UINT ThreadProc(LPVOID lpData)
    {
    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;
    }
      

  7.   

    struct Context
    {
    HWND m_hWnd;
    HANDLE   hDevice;
    BOOL     bTerminateThread;
    BYTE     *pBuf; Context()   // default value
    {
    bTerminateThread=FALSE;
    hDevice=INVALID_HANDLE_VALUE;
    }
    };