一个基于对话框的串口通信程序,使用MSCOMM控件。
在主对话框类里定义:CMScomm m_com;
使用向导添加处理函数:OnCommMscomm();我现在的问题是:
正常情况:如果在主线程中打开、设置串口,则OnCommMscomm()能够响应串口数据。
异常情况:如果我在一个新起的子线程中打开、设置串口,如果线程没有结束,则OnCommMscomm()能够响应串口数据。如果此子线程结束,则OnCommMscomm()不响应串口数据。如果调用m_com.GetPortOpen()查看串口状态,却又是打开的!
m_com作为主对话框类成员,对该类来说应该是共享的,即使是在新启动的线程中打开,应该对整个类有效。只要我没在线程中关闭串口,即使线程结束,在该类的其它成员眼中,串口应该是处在打开并有效地状态吧?不解,是否是对线程理解有误?望各位见解一下,谢谢

解决方案 »

  1.   

    MSCOMM控件不能和线程同时使用,使用CSerialPort类
      

  2.   

    这样打开串口,则串口响应正常:
    void CGpsTestWizardDlg::OnButtonRun() 
    {
    // TODO: Add your control notification handler code here
             if(m_com.GetPortOpen())
    m_com.SetPortOpen(FALSE); m_com.SetCommPort(iPort);
    if(!m_com.GetPortOpen())
    m_com.SetPortOpen(TRUE);
    else
    AfxMessageBox("Can not open serial port"); m_com.SetSettings(szComSetting);
    m_com.SetRThreshold(1);
    m_com.SetInputMode(1);
    m_com.SetInputLen(0);
    m_com.GetInput();
    return;
    }
    如果这样,在一个子线程中打开串口,则:如果子线程不结束,则串口响应正常。如果子线程结束,则串口无响应,但用m_com.GetPortOpen()查询却显示串口是打开的:
    void CGpsTestWizardDlg::OnButtonRun() 
    {
    // TODO: Add your control notification handler code here
             ::AfxBeginThread(ThreadGpsTest,(LPVOID)this);
    return;
    }UINT ThreadGpsTest(LPVOID pParam)
    {
    CGpsTestWizardDlg * pApp = (CGpsTestWizardDlg *)pParam;         if(pApp->m_com.GetPortOpen())
    pApp->m_com.SetPortOpen(FALSE); pApp->m_com.SetCommPort(iPort);
    if(!pApp->m_com.GetPortOpen())
    pApp->m_com.SetPortOpen(TRUE);
    else
    AfxMessageBox("Can not open serial port"); pApp->m_com.SetSettings(szComSetting);
    pApp->m_com.SetRThreshold(1);
    pApp->m_com.SetInputMode(1);
    pApp->m_com.SetInputLen(0);
    pApp->m_com.GetInput();    return 1; }
      

  3.   

    首先,一个MSCOMM控件只能对应一个串口。但不知楼上两位“MSCOMM控件不支持多线程”怎么来理解合适?——子线程中操作的串口,对主线程来说是无效的?但我在子线程给串口写信息是正常的,只要我子线程不结束,主线程能够正常响应串口过来的信息,这作何解?
      

  4.   

    另一问:MSCOMM控件的响应函数只能在主线程中吗?因为要同时支持8路的串口通信和串口数据(高速)处理,如果8路都在主线程中处理,估计运行起来,程序就处在“僵死”状态,UI不响应用户了!
      

  5.   

    思考了一下,简而言之:我要在新创建的线程中操作和使用mscomm控件,而在主程序中读取mscomm控件从串口中出来的数据。
      

  6.   

    还有一个问题 我在一个线程中用MSComm控件来发送数据 为什么一运行到comm发数据的时候 程序就崩溃呢?测试了一下 不只是用output的时候 而是一调用MSComm控件 程序就崩溃 这是为什么呢?