我请问问大家 我用vc的mfc编程,直接用VC++访问串口,有一个进程是一直查询串口有没有收到数据 ,如果有数据的话再按照和设备的通讯协议交换数据,想问如何查询串口有没有收到数据,只检测而不读数据,本人刚接触vc,完全新手,请各位指点~

解决方案 »

  1.   

    http://topic.csdn.net/t/20040427/17/3014031.html
    或许有用
      

  2.   

    typedef struct _COMSTAT {
        DWORD fCtsHold : 1;
        DWORD fDsrHold : 1;
        DWORD fRlsdHold : 1;
        DWORD fXoffHold : 1;
        DWORD fXoffSent : 1;
        DWORD fEof : 1;
        DWORD fTxim : 1;
        DWORD fReserved : 25;
        DWORD cbInQue;
        DWORD cbOutQue;
    } COMSTAT, *LPCOMSTAT;#define EV_RXCHAR           0x0001  // Any Character received
    这里的DWORD cbInQue;或者EV_RXCHAR           
      

  3.   

     是不是用MSComm控件写?
    如果是双击该控件产生的写以下代码
    void CJIANView::OnOnCommMscomm1() 
    {
        VARIANT variant_inp;
        COleSafeArray safearray_inp;
        LONG len,k;
        BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
        CString strtemp;
        if(m_MSComm.GetCommEvent()==2){//等于2表示读缓冲区有数据
    variant_inp=m_MSComm.GetInput(); //读缓冲区
    safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
    len=safearray_inp.GetOneDimSize(); //得到有效数据长度
    for(k=0;k<len;k++)safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组 
       }
    }
      

  4.   

    不是用MSComm控件,用win api函数 看到一个WaitCommEvent()函数但不太会用,是不是先要用setCommMask(),然后只需要调用一次WaitCommEvent()判断返回值就行了?
      

  5.   

    给你贴一个经常见到的串口通信类片断 //监视线程
    static DWORD WINAPI com_thread(LPVOID para)
    {
    _thread_com *pcom = (_thread_com *)para;
    if(!SetCommMask(pcom->_com_handle, EV_RXCHAR | EV_ERR))
    return 0; COMSTAT  stat;
    DWORD error; for(DWORD length, mask = 0; pcom->_run_flag && pcom->is_open(); mask = 0)
    {
    if(!WaitCommEvent(pcom->_com_handle, &mask, &pcom->_wait_o))
    {
    if(GetLastError() == ERROR_IO_PENDING)
    {
    GetOverlappedResult(pcom->_com_handle, &pcom->_wait_o, &length, true);
    }
    } if(mask & EV_ERR) // == EV_ERR
    ClearCommError(pcom->_com_handle, &error, &stat); if(mask & EV_RXCHAR) // == EV_RXCHAR
    {
    ClearCommError(pcom->_com_handle, &error, &stat);
    if(stat.cbInQue > pcom->_notify_num)
    pcom->on_receive();
    }
    } return 0;
    }
    //异步读
    int read(char *buf, int buf_len)
    {
    if(!is_open())
    return 0; buf[0] = '\0'; COMSTAT  stat;
    DWORD error; if(ClearCommError(_com_handle, &error, &stat) && error > 0) //清除错误
    {
    PurgeComm(_com_handle, PURGE_RXABORT | PURGE_RXCLEAR); /*清除输入缓冲区*/
    return 0;
    } if(!stat.cbInQue)// 缓冲区无数据
    return 0; unsigned long r_len = 0; buf_len = min((int)(buf_len - 1), (int)stat.cbInQue); if(!ReadFile(_com_handle, buf, buf_len, &r_len, &_ro)) //2000 下 ReadFile 始终返回 True
    {
    if(GetLastError() == ERROR_IO_PENDING) // 结束异步I/O
    {
    if(!GetOverlappedResult(_com_handle, &_ro, &r_len, false))
    {
    if(GetLastError() != ERROR_IO_INCOMPLETE)//其他错误
    r_len = 0;
    }
    }
    else
    r_len = 0;
    } buf[r_len] = '\0';
    return r_len;
    }
      

  6.   

    ClearCommError可以得到输入缓冲区状态
      

  7.   

    有一个GetCommProperty函数,可以取得串口的信息
      

  8.   

    我用了 WaitCommEvent 这个函数,现在问题基本已经解决 谢谢各位 ~~