BOOL CJiedianDialog::OnInitDialog() 
{
CDialog::OnInitDialog();

// TODO: Add extra initialization here
SetTimer(1,1000,NULL);
if(m_ctrlComm.GetPortOpen())
        m_ctrlComm.SetPortOpen(FALSE);
m_ctrlComm.SetCommPort(1);//初始化串口信息
         m_ctrlComm.SetInputMode(1);
m_ctrlComm.SetInBufferSize(1024);
m_ctrlComm.SetOutBufferSize(512);
m_ctrlComm.SetSettings("9600,n,8,1");
if(!m_ctrlComm.GetPortOpen())
        m_ctrlComm.SetPortOpen(TRUE);
m_ctrlComm.SetRThreshold(1);
m_ctrlComm.GetInput();
return TRUE;  // return TRUE unless you set the focus to a control
              // EXCEPTION: OCX Property Pages should return FALSE
}//写一个通讯的单文档程序,不知道为什么,第一次打开通讯对话框没问题,只退出该对话框程序不退出再次打开通讯对话框就出现一个提示port already open,物理上确实没有被占用,也就是退出没关闭串口?可是我在初始化串口的时候不是用m_ctrlComm.SetPortOpen(FALSE);已经关闭了吗?那位知道原因,麻烦提示下,谢谢

解决方案 »

  1.   


    BOOL CJiedianDialog::OnInitDialog() 
    {
        CDialog::OnInitDialog();
        
        // TODO: Add extra initialization here
        SetTimer(1,1000,NULL);
        m_ctrlComm.SetCommPort(1);   //选择一号串口
        if(m_ctrlComm.GetPortOpen())
            m_ctrlComm.SetPortOpen(FALSE);
        m_ctrlComm.SetCommPort(1);//初始化串口信息
             m_ctrlComm.SetInputMode(1);
        m_ctrlComm.SetInBufferSize(1024);
        m_ctrlComm.SetOutBufferSize(512);
        m_ctrlComm.SetSettings("9600,n,8,1");
        if(!m_ctrlComm.GetPortOpen())
            m_ctrlComm.SetPortOpen(TRUE);
        m_ctrlComm.SetRThreshold(1);    
        m_ctrlComm.GetInput();
        return TRUE;  // return TRUE unless you set the focus to a control
                      // EXCEPTION: OCX Property Pages should return FALSE
    }
      

  2.   

    lfchen   
    一条晚起的虫-床上用品专卖(美女、TT之类的不在此列)   
    等   级: 
      发表于:2008-01-27   18:14:5325楼   得分:0   
    m_ctrlComm.GetPortOpen()前加上   
    m_ctrlComm.SetCommPort(1);   
    //没有指定串口,天知道你查询的是哪个串口的状态。   
      
    //这个按你说的做了还是不行,我这个是基于单文档的,从菜单打开一个模式对话框上边的代码就没问题,如果按我以前的是非模式对话框就提示port   already   open,而关掉整个程序后第一次打开是没问题的,显然就是关闭对话框的时候需要处理一下(关闭串口),但是一直没效果?怎么做?网上没相关资料
      

  3.   


    还是API函数好用:
    http://vckbase.com/document/viewdoc/?id=1114
      

  4.   

    非模式对话框就提示port       already       open
    //此时用串口助手之类的串口调试工具打开串口有没有问题?
    //有问题的话,就是串口关闭没有成功
    //关闭的时候, m_ctrlComm.SetCommPort(1);   //选择一号串口
     
      

  5.   

    非模态对话框需要重载函数OnCanel,并且在这个函数中调用DestroyWindow。并且不能调用基类的OnCancel,因为基类的OnCancel调用了EndDialog这个函数,这个函数是针对模态对话框的。还有一个必须重载的函数就是PostNcDestroy,这也是一个虚函数,通常的非模态对话框是用类的指针,通过new创建的,这就需要在PostNcDestroy函数中delete掉这个指针,否则因为你在父窗口已经创建新窗口过,所以初始化了,就把串口已经打开了,这个我遇到过
    //对话框中:
    void CTestDlg::OnCancel()
    {
        DestroyWindow();
    }void CTestDlg::PostNcDestroy()
    {
        CDialog::PostNcDestroy();
        delete this;
    }