串口应用中不能触发OnCommMscomm事件,已居初始化时做m_COM.SetRThreshold(1),发送数据后接收区没有任何显示,跟踪程序发现OnCommMscomm事件不能触发,OnCommMscomm函数根本就没有调用到,不知是什么原因?

解决方案 »

  1.   

    1 端口是否正确
    2 波特率是否统一
    3 是否关闭端口流控制
    4 初始化是否正确,是否正确打开串口
    m_ComCtrl.SetCommPort(port_num);
    m_ComCtrl.SetSettings("115200,n,8,1");//波特率、校验位、数据位、停止位
    m_ComCtrl.SetInputMode(1); //comInputModeBinary
    m_ComCtrl.SetRThreshold(1);
    m_ComCtrl.SetPortOpen(true);
      

  2.   

    多谢!不过还是没找到原因,贴出代码,请指教,谢谢!初始化代码:
    if (m_COM.GetPortOpen())
    {
    m_COM.SetPortOpen(FALSE);
    } m_COM.SetCommPort(1);

    if (!m_COM.GetPortOpen())
    {
    m_COM.SetPortOpen(TRUE);
    m_szStatus = "Open";
    UpdateData(FALSE);
    GetDlgItem(IDC_OPEN_CLOSE)->SetWindowText("Close");
    }
    else
    {
    AfxMessageBox("Can't Open The Serial Port !");
    } m_COM.SetSettings("9600,n,8,1");
    m_COM.SetInputMode(1);
    m_COM.SetRThreshold(1);
    // m_COM.SetRTSEnable(1); m_COM.SetInputLen(0);
    m_COM.GetInput();// m_COM.SetSThreshold(1); m_nRecvCount = 0;
    m_nSendCount = 0;
    发送数据:
    if (m_COM.GetPortOpen())
    {
    UpdateData(TRUE);
    if (!m_szSendData.IsEmpty())
    {
    CByteArray hexdata;
    int len; len = String2Hex(m_szSendData,hexdata);
    m_COM.SetOutput(COleVariant(hexdata));
    m_nSendCount += len;
    UpdateData(FALSE);
    m_COM.GetInput();
    }
    else
    {
    AfxMessageBox("No Data to Send !");
    }
    }
    接收数据代码: VARIANT variant_in;
    COleSafeArray safearray_in;
    LONG len,k;
    BYTE rxdata[2048], bt;
    CString strtemp;

    variant_in = m_COM.GetInput();
    safearray_in = variant_in;
    len = safearray_in.GetOneDimSize();
    for (k = 0; k < len; k++)
    {
    safearray_in.GetElement(&k,rxdata+k);
    }
    for (k = 0; k < len; k++)
    {
    m_nRecvCount++;
    bt = *(char*)(rxdata+k);
    strtemp.Format("%02X", bt);
    m_szRecvData += strtemp;
    UpdateData(FALSE);
    }
      

  3.   

    请问LZ的数据发送源是什么?
    先用串口调试软件测试串口硬件是否正常
    可以把DB9的Pin2 Pin3 短接,自发自收试试看
      

  4.   

    为什么发送后就读取端口呢?看我的 
    m_Send 是关联了发送编辑框的CString
    m_Receive 是关联了接收编辑框的CString
    m_ComPort 是关联了CMSComm的 控件变量//打开端口
    BOOL CD2Dlg::PortOpen()
    {
      m_ComPort.SetCommPort(1);
      m_ComPort.SetSettings("115200,n,8,1");//波特率、校验位、数据位、停止位 
      m_ComPort.SetInputMode(1); //comInputModeBinary 
      m_ComPort.SetRThreshold(1); 
      m_ComPort.SetPortOpen(true); 
      return(m_ComPort.GetPortOpen());
    }//编辑框输入信息后点击发送
    void CD2Dlg::OnSend() 
    {
      // TODO: Add your control notification handler code here
      UpdateData();  VARIANT var = COleVariant(m_Send);
      m_ComPort.SetOutput(var);

      m_Send.Empty();
      UpdateData(false);
    }//接收响应
    void CD2Dlg::OnCommEvent() 
    {
      // TODO: Add your control notification handler code here
      switch(m_ComPort.GetCommEvent())
      {
        case 2:
        {
          VARIANT var;
          var = m_ComPort.GetInput();
          TCHAR buff[1024] = {0}; //假设接收不超过1024字节      
          memcpy(buff,var.parray->pvData,var.parray->rgsabound[0].cElements);

          m_Receive += buff;
          UpdateData(false);

          break;
        }
      }
    }
      

  5.   

    果然是这段代码的问题:m_COM.SetOutput(COleVariant(hexdata)); 
    m_nSendCount += len; 
    UpdateData(FALSE); 
    m_COM.GetInput(); 

    去掉m_COM.GetInput(); 就可以了。
    感谢zgl7903!!!