COMMTIMEOUTS TimeOuts;
        memset(&TimeOuts,0,sizeof(TimeOuts));
        TimeOuts.ReadIntervalTimeout = MAXDWORD;
        TimeOuts.ReadTotalTimeoutConstant = 10;
        TimeOuts.ReadTotalTimeoutMultiplier = 10;
        TimeOuts.WriteTotalTimeoutConstant = 2000;
        TimeOuts.WriteTotalTimeoutMultiplier = 50;     ReadFile(hCom,pszRecv,1024,&ReadBytes,&ReadOver)
发现只读取了8个字节的数据(ReadBytes的值是8),本来要读取25个字节的数据。不知道哪里出了问题?

解决方案 »

  1.   

    这是读线程DWORD WINAPI ReadCommThread(LPARAM lparam)///读线程
    {
        extern charCount;
        extern HANDLE m_hCom;
        extern OpenCloseFlag;
        extern unsigned char pszRecv[1024];
        DWORD ReadBytes;
    DWORD bResult;
    DWORD dwErr;
    OVERLAPPED ReadOver;
    DWORD hMask;
    DWORD CommEvent;
    int i=0;
    CRITICAL_SECTION section;
    COMSTAT comstat;
    DWORD Flag=0;
    memset(&ReadOver,0x00,sizeof(ReadOver));
         ReadOver.Offset=0;
        ReadOver.OffsetHigh=0;
    ReadOver.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
    PurgeComm(m_hCom,PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR);
    InitializeCriticalSection(&section);
       
        for(;;)
    {
    bResult=WaitCommEvent(m_hCom,&hMask,&ReadOver);   
    if(OpenCloseFlag==1)  //串口已被打开才做下一部

         if(!bResult)
         {
         switch(dwErr=GetLastError())
         {
         case ERROR_IO_PENDING:
                          
                       // MessageBox(NULL,"读取成功",0,MB_OK);
         Flag^=1;
         break;
         /* case 87:
                        
         break;*/
         default:
             SetDlgItemText((HWND)lparam,IDC_COMMSTATE,"WaitCommEvent Error");
         goto ErrorNext;
         }
         }else
         {
         bResult=ClearCommError(m_hCom,&dwErr,&comstat);
         if(comstat.cbInQue==0)
            continue;
         }
         WaitForSingleObject(ReadOver.hEvent,INFINITE);///等侍异步操作完成
         Flag=0;
               //ResetEvent(ReadOver.hEvent);////设置为不发信号状态
         GetCommMask(m_hCom,&hMask);
         if(hMask & EV_CTS)//CTS信号改变 
         {
         }
         if(hMask & EV_RXFLAG)//收到特殊字符 
         {
         }
         if(hMask & EV_BREAK)
         {
         }
         if(hMask & EV_ERR)//端口错误信号
         {
         }
         if(hMask & EV_RING)       //ring信号变化 
         {
         }
        
         if(hMask & EV_RXCHAR)///收到一个或多个字符
         {
            
                    EnterCriticalSection(&section);
             bResult=ClearCommError(m_hCom,&dwErr,&comstat);
         if(!ReadFile(m_hCom,pszRecv,1024,&ReadBytes,&ReadOver))
         {
         switch(dwErr=GetLastError())
         {
         case ERROR_IO_PENDING:
         Flag^=1;
         break;
         default:
         goto ErrorNext;
         }
         } 
         if(Flag & 1)
         {
                       
         SetDlgItemText((HWND)lparam,IDC_COMMSTATE,"正在读取数据");
        
         WaitForSingleObject(ReadOver.hEvent,INFINITE);
         if(GetOverlappedResult(m_hCom,&ReadOver,&ReadBytes,TRUE))
         {
         SetDlgItemText((HWND)lparam,IDC_COMMSTATE,"读取数据完成");
         SetDlgItemText((HWND)lparam,IDC_SHOWINFO,pszRecv);
         }
         }
            LeaveCriticalSection(&section);     }
    ErrorNext:
    Flag=0;
    PurgeComm(m_hCom,PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR);
    }
     
    }
    return 1;
    }
      

  2.   

    超时设置有问题,现在已经解决了!
    但是还有一个问题,就是程序一运行,WaitCommEvent就能扑捉到串口有EV_RXCHAR事件,不知道什么原因?