C# 检测计算机何时没有列为设备的任何COM串行端口

C# 检测计算机何时没有列为设备的任何COM串行端口,c#,visual-studio,C#,Visual Studio,我需要找到一些方法来检测计算机是否连接了任何COM端口设备。 代码显示当某些COM可用时,但当我断开仅有的一个设备的连接并使用COM端口时,没有显示任何内容。 我在windows设备面板上检查,没有COM,什么也没有发生。 然后我连接设备,代码正常工作,并通知COM端口已找到。 我做错了什么 string[] ports = SerialPort.GetPortNames(); string pattern = "COM"; foreach (string portnames in ports

我需要找到一些方法来检测计算机是否连接了任何COM端口设备。 代码显示当某些COM可用时,但当我断开仅有的一个设备的连接并使用COM端口时,没有显示任何内容。 我在windows设备面板上检查,没有COM,什么也没有发生。 然后我连接设备,代码正常工作,并通知COM端口已找到。 我做错了什么

string[] ports = SerialPort.GetPortNames();
string pattern = "COM";

foreach (string portnames in ports)
{
    if (System.Text.RegularExpressions.Regex.IsMatch(portnames, pattern))
    {
        System.Windows.MessageBox.Show("COM port found!");
    }    
    else
    {
        System.Windows.MessageBox.Show("COM port not found!");
        //this not is working !
    }
}

嗯。 不知道为什么else不起作用,但是知道代码的第一部分起作用了好的,这里我更新代码,现在开始工作。 谢谢大家帮忙

string[] ports = SerialPort.GetPortNames();
string pattern = "COM";

foreach (string portnames in ports)
{
    if (System.Text.RegularExpressions.Regex.IsMatch(portnames, pattern))
    {
        System.Windows.MessageBox.Show("COM port found!");
    }    
    else
    {
        System.Windows.MessageBox.Show("COM port not found!");
        //this not is working !
    }
}
            existCOMport = false;


            string[] ports = SerialPort.GetPortNames();
            string pattern = "COM";
            foreach (string portnames in ports)
            {
                if (System.Text.RegularExpressions.Regex.IsMatch(portnames, pattern) == true)
             {
                    existCOMport = true;
                 //START HANDSHAKE CODE
                }


             }

                if (existCOMport == false)
            {
             //INFORM, NOTHING TO DO, NO ANY COM PORTS DEVICE
            }
仅返回可用的端口

string[] ports = SerialPort.GetPortNames();
string pattern = "COM";

foreach (string portnames in ports)
{
    if (System.Text.RegularExpressions.Regex.IsMatch(portnames, pattern))
    {
        System.Windows.MessageBox.Show("COM port found!");
    }    
    else
    {
        System.Windows.MessageBox.Show("COM port not found!");
        //this not is working !
    }
}
获取当前计算机的串行端口名数组

string[] ports = SerialPort.GetPortNames();
string pattern = "COM";

foreach (string portnames in ports)
{
    if (System.Text.RegularExpressions.Regex.IsMatch(portnames, pattern))
    {
        System.Windows.MessageBox.Show("COM port found!");
    }    
    else
    {
        System.Windows.MessageBox.Show("COM port not found!");
        //this not is working !
    }
}
所以你真的想要这样的支票:

string[] ports = SerialPort.GetPortNames();
string pattern = "COM";

foreach (string portnames in ports)
{
    if (System.Text.RegularExpressions.Regex.IsMatch(portnames, pattern))
    {
        System.Windows.MessageBox.Show("COM port found!");
    }    
    else
    {
        System.Windows.MessageBox.Show("COM port not found!");
        //this not is working !
    }
}
if(ports.Length > 0)
{
    System.Windows.MessageBox.Show("COM port found!");
    //then maybe do a foreach ports here if needed
}
else
{
    System.Windows.MessageBox.Show("COM port not found!");
}

不幸的是,旧的串行端口不是这样工作的。 您无法检测是否插入了电缆。但是,您可以通过打开端口并侦听预期数据(如果是活动设备),来检测一个特定设备(您知道其中一个设备如何通信)是否正确供电和连接。 或者通过打开一个连接并向设备发送一个已知的命令,该命令调用来自设备的(已知)响应。 (例如:gps装置通常每xxx个时间间隔自动传输数据),一些设备仅响应特定命令

string[] ports = SerialPort.GetPortNames();
string pattern = "COM";

foreach (string portnames in ports)
{
    if (System.Text.RegularExpressions.Regex.IsMatch(portnames, pattern))
    {
        System.Windows.MessageBox.Show("COM port found!");
    }    
    else
    {
        System.Windows.MessageBox.Show("COM port not found!");
        //this not is working !
    }
}

当您知道您的设备时,您可以监听或调用命令。并将其与您的可疑退货数据进行比较。使用超时来处理没有串行设备连接到COM端口的情况。

所讨论的设备是“真正的”串行端口设备还是USB?这可能会对可能的答案产生影响。在“真正的串行设备”的情况下-它是否正确支持DSR(数据集就绪)/CTS(清除发送)信令?这是非常不可靠的代码,因为您只需检查端口。长度>0。实际上,您总是非常非常关心特定端口是否可用。但是可以肯定的是,USB模拟器从来都不是问题。串行端口不是即插即用设备,使用USB设备驱动程序的程序员的工资由极其便宜的硬件支持。首先,在断开设备连接之前,务必使用“安全删除硬件”托盘图标。@HansPassant“从来都不是问题”==“总是问题”?双重否定让我头晕目眩:)@Akspa串行端口没有“连接”状态。您可以检测各种管脚的状态,但仅此而已。另一个设备甚至不需要一直保持它们中的任何一个处于上升状态。您指的是USB到串行适配器吗?谢谢您的回复。我已经扫描了所有的com端口,发送了一条消息,等待应答,所有的握手部分都已经实现了。只是想实现一些干净的代码而不抛出异常,在没有任何com端口的情况下。无论如何,感谢您的回复和时间。“您无法检测到是否插入了电缆。”-但这不是全部内容。使用此代码,当然不!了解COM设备是否处于活动状态的正确方法是启动与该设备的握手。我已经用其他代码解决了那个部分。但是只需要一个简单的代码来检测系统上列出的所有COM,真实的或虚拟的,可用的或不可用的,只列出所有COM。我想我的标题错了。对不起,我的母语是西班牙语而不是英语。无论如何,我更新的代码现在可以工作了,基本上我可以检测到什么时候没有任何端口。如果计算机上没有COM端口,那么for-each循环将永远不会迭代。这是因为SerialPort.GetPortNames()只返回计算机上可用的端口。如果没有端口,它将返回一个包含零元素的空数组。(该函数还仅列出COM端口,因此实际上不需要与'COM'的正则表达式匹配)。明白了,就在你回答后贴上;)谢谢你的回复和帮助,不管怎样,我修复了代码。顺致敬意,
string[] ports = SerialPort.GetPortNames();
string pattern = "COM";

foreach (string portnames in ports)
{
    if (System.Text.RegularExpressions.Regex.IsMatch(portnames, pattern))
    {
        System.Windows.MessageBox.Show("COM port found!");
    }    
    else
    {
        System.Windows.MessageBox.Show("COM port not found!");
        //this not is working !
    }
}