上次发了一贴!一起节。
到底SetCommMask 和GetCommMask怎么用? 
我根据串口通信类改的!
CSerialPortEx::InitPort()
{  
   省略了一些
    我只对这四个事件感兴趣;
    SetCommMask(m_hComm, EV_RLSD|EV_RING|EV_DSR|EV_CTS);
}
UINT CSerialPortEx::CommThread(LPVOID pParam)

     省略了一些定义;
   bResult = WaitCommEvent(port->m_hComm, &Event, &port->m_ov);          ::WaitForMultipleObjects(m_hComm,INFINITE);

 CString yy;
 yy=""; 
 GetCommMask(port->m_hComm, &CommEvent);
      if (CommEvent & EV_CTS)
 yy+="EV_CTS";
                                if (CommEvent & EV_DSR)
                                yy+="EV_DSR";
 if (CommEvent & EV_RING)
yy+="EV_RING";
if (CommEvent & EV_RLSD)
                                    yy+="EV_RLSD";
  AfxMessageBox(yy);
//在这里yy的结果是yy=EV_CTSEV_DSREV_RINGEV_RLSD
//这证明串口的那四个脚都有电平变化。而事实我只触发CTS脚的电平。
//怎么这四个脚;;
//我把SetCommMask(m_hComm, EV_RLSD|EV_RING|EV_DSR|EV_CTS) 改为
//SetCommMask(m_hComm, EV_CTS)正确,但是其他三个脚就对电平变化没有反映。
大家看一看,拉一把吧!
                                  
                         return 0;}

解决方案 »

  1.   

    我只对这四个事件感兴趣;
     SetCommMask(m_hComm, EV_RLSD|EV_RING|EV_DSR|EV_CTS);
    //这证明串口的那四个脚都有电平变化。而事实我只触发CTS脚的电平。
    //怎么这四个脚;;
    //SetCommMask(m_hComm, EV_CTS)正确,但是其他三个脚就对电平变化没有反映。SetCommMask() ok!!!!!!
      

  2.   

    不应该会这样吧,我查过的所有资料上都这么写,你在看看,另外你把if (CommEvent & EV_CTS)改成if (CommEvent && EV_CTS)因为第一种返回的是CommEvent,而且CommEvent可定不会变化,第二种返回的是CommEvent中是否包含有EV_CTS,我觉得第2种比较合理些
      

  3.   

    我也不知道怎么做了。但是用GETCOMMMODESTATE可以看到有些脚的信号没有变化。但是CommEvent有它的变化。难道?
      

  4.   

    SetCommMask(m_hComm, EV_RLSD|EV_RING|EV_DSR|EV_CTS);
    是设置你要监视的事件;
    GetCommMask(port->m_hComm, &CommEvent);
    时得到你要监视的事件。
    你可以这样写:
    WaitCommEvent(port->m_hComm, &Event, &port->m_ov);
    if((Event& EV_RLSD)== EV_RLSD)
       //get EV_RLSD event
    if((Event& EV_RING)==EV_RING)
       //get EV_RING event
    if((Event& EV_DSR)== EV_DSR)
       //get EV_DSR event
    if((Event& EV_CTS)== EV_CTS)
       //get EV_CTS event