我打开了com1端口,是否意味着com2也被打开了?

时间:2022-12-13 15:21:11
我用的是mscomm控件,在vc下编程。

大致程序是这样的
button1;

m_Com.SetCommPort(1);              //选择端口
if(!m_Com.GetportOpen())           //打开端口
{

  m_Com.SetPortOpen(TRUE);
}
 
button2的程序
m_Com.SetCommPort(2);              //选择端口
if(!m_Com.GetportOpen())           //打开端口
{

  m_Com.SetPortOpen(TRUE);
}
我先按下button1,没有问题,然后再按下button2,就会弹出对话框,显示端口已经被打开。
这是什么原因?
如果我想把提示端口已经打开的对话框屏蔽怎么做?
 

5 个解决方案

#1


端口1、2没有关联,不过看你的程序没有CloseCom()指令!

#2


不能使用同一个m_Com,应该这样:

button1;
m_Com_1.SetCommPort(1);              //选择端口
if(!m_Com_1.GetportOpen())           //打开端口
{

  m_Com_1.SetPortOpen(TRUE);
}
 
button2的程序
m_Com_2.SetCommPort(2);              //选择端口
if(!m_Com_2.GetportOpen())           //打开端口
{

  m_Com_2.SetPortOpen(TRUE);
}

#3


谢谢   回复人: sans(sans) 
我也发现了这个问题,就是不能使用同一个mscomm,但考虑的实际情况是要求我能选择端口进行通讯,比如客户最初选了com1,后来他想换一个端口试试比如com2,这样我就必须用一个mscomm。而有可能在com1-》com2的过程如果com1没有被关闭过,那么再直接去调用这个函数就会出现问题。
不过我发现mscomm有点问题,我现在是这样理解,不知道对不对。
m_Com.GetPortOpen()这个函数并没有真正的判断端口是否打开。
而是根据m_Com.SetPortOpen()这个函数来记忆端口是否打开,
所以GetPortOpen()函数其实只是一个flag,它没有做硬件上的检查。
SetCommPort()函数它先会判断GetPortOpen()是否为真,如果为真,那么就会弹出对话框“端口已经打开”,我一开始提到的报错就是由于这个原因。尽管实际端口2没有打开。
SetPortOpen()函数它在打开端口之前会真正判断一下端口是否被打开了,如果端口被打开了,那么就会弹出对话框“端口已经打开”,这个时候端口才是真正打开的状态。


根据以上的分析我写了一个我自己认为是比较好的初始化函数。
BOOL  CommInit(int port)
{
    if(m_Com.GetCommPort!=port) 判断端口是否变了
    {
       if(m_Com.GetPortOpen())  把原先的端口关闭
       {
           m_Com.SetPortOpen(FALSE);
       }
       m_Com.SetPortOpen(port);  设置新的端口
    }
    if(!m_Com.GetPortOpen())
    {
           m_Com.SetPortOpen(TRUE);
    }
}

#4


还有一个问题是如何才能判断端口是否真正打开,
刚才说了GetPortOpen()函数是判断不了端口是否真正打开的,因为我先把端口一打开,然后运行这个程序,断点执行,发觉得到的结论是false,就是端口没有打开

#5


我没看你的代码,两个串口是没有关联的,
我是学串口的,想的话找我了,

zhang865@sohu.com

#1


端口1、2没有关联,不过看你的程序没有CloseCom()指令!

#2


不能使用同一个m_Com,应该这样:

button1;
m_Com_1.SetCommPort(1);              //选择端口
if(!m_Com_1.GetportOpen())           //打开端口
{

  m_Com_1.SetPortOpen(TRUE);
}
 
button2的程序
m_Com_2.SetCommPort(2);              //选择端口
if(!m_Com_2.GetportOpen())           //打开端口
{

  m_Com_2.SetPortOpen(TRUE);
}

#3


谢谢   回复人: sans(sans) 
我也发现了这个问题,就是不能使用同一个mscomm,但考虑的实际情况是要求我能选择端口进行通讯,比如客户最初选了com1,后来他想换一个端口试试比如com2,这样我就必须用一个mscomm。而有可能在com1-》com2的过程如果com1没有被关闭过,那么再直接去调用这个函数就会出现问题。
不过我发现mscomm有点问题,我现在是这样理解,不知道对不对。
m_Com.GetPortOpen()这个函数并没有真正的判断端口是否打开。
而是根据m_Com.SetPortOpen()这个函数来记忆端口是否打开,
所以GetPortOpen()函数其实只是一个flag,它没有做硬件上的检查。
SetCommPort()函数它先会判断GetPortOpen()是否为真,如果为真,那么就会弹出对话框“端口已经打开”,我一开始提到的报错就是由于这个原因。尽管实际端口2没有打开。
SetPortOpen()函数它在打开端口之前会真正判断一下端口是否被打开了,如果端口被打开了,那么就会弹出对话框“端口已经打开”,这个时候端口才是真正打开的状态。


根据以上的分析我写了一个我自己认为是比较好的初始化函数。
BOOL  CommInit(int port)
{
    if(m_Com.GetCommPort!=port) 判断端口是否变了
    {
       if(m_Com.GetPortOpen())  把原先的端口关闭
       {
           m_Com.SetPortOpen(FALSE);
       }
       m_Com.SetPortOpen(port);  设置新的端口
    }
    if(!m_Com.GetPortOpen())
    {
           m_Com.SetPortOpen(TRUE);
    }
}

#4


还有一个问题是如何才能判断端口是否真正打开,
刚才说了GetPortOpen()函数是判断不了端口是否真正打开的,因为我先把端口一打开,然后运行这个程序,断点执行,发觉得到的结论是false,就是端口没有打开

#5


我没看你的代码,两个串口是没有关联的,
我是学串口的,想的话找我了,

zhang865@sohu.com