C# 如何找到可用的COM端口?

C# 如何找到可用的COM端口?,c#,serial-port,C#,Serial Port,如何在我的电脑中找到可用的COM端口?我使用的是frameworkv1.1。是否可以找到所有COM端口?如果可能,请帮助我解决问题。Framework v1.1 AFAIK不允许您这样做 在2.0中有一个静态函数 SerialPort.GetPortNames() WMI包含大量硬件信息。查询的实例 (我记不起.NET 1.1中有多少WMI查询支持。)在.NET v1.1中不支持串行端口通信。最常见的解决方案是使用VB6.0安装中的MSCOMMCTL active X控件(从“添加引用”对话框

如何在我的电脑中找到可用的COM端口?我使用的是frameworkv1.1。是否可以找到所有COM端口?如果可能,请帮助我解决问题。

Framework v1.1 AFAIK不允许您这样做

在2.0中有一个静态函数

SerialPort.GetPortNames()

WMI包含大量硬件信息。查询的实例


(我记不起.NET 1.1中有多少WMI查询支持。)

在.NET v1.1中不支持串行端口通信。最常见的解决方案是使用VB6.0安装中的MSCOMMCTL active X控件(从“添加引用”对话框将COM组件导入.net项目)

在更高版本中,可通过System.IO.Ports名称空间获得串行端口支持。另外请注意,没有API可以为您提供免费端口列表


您可以获取所有端口名的列表,然后尝试打开连接。如果端口已在使用中,则会发生异常

使用
QueryDosDevice
API函数。这是一个VB6代码段:

    ReDim vRet(0 To 255)

    sBuffer = String(100000, 1)
    Call QueryDosDevice(0, sBuffer, Len(sBuffer))
    sBuffer = Chr$(0) & sBuffer
    For lIdx = 1 To 255
        If InStr(1, sBuffer, Chr$(0) & "COM" & lIdx & Chr$(0), vbTextCompare) > 0 Then
            vRet(lCount) = "COM" & lIdx
            lCount = lCount + 1
        End If
    Next

可用串行端口也可以在注册表中的
HKEY\U LOCAL\U MACHINE\hardware\devicemap\serialcomm
项的值中找到。

从操作系统直接问一个问题怎么样:

using System;
using System.Collections.Generic;
using Microsoft.Win32;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;

public class MyClass
{
    private const uint GENERIC_ALL = 0x10000000;
    private const uint GENERIC_READ = 0x80000000;
    private const uint GENERIC_WRITE = 0x40000000;
    private const uint GENERIC_EXECUTE = 0x20000000;    
    private const int OPEN_EXISTING = 3;    
    public const int INVALID_HANDLE_VALUE = -1;

    public static void Main()
    {
        for (int i = 1; i <= 32; i++)
            Console.WriteLine ("Port {0}: {1}", i, PortExists (i));
    }

    private static bool PortExists (int number) {
        SafeFileHandle h = CreateFile (@"\\.\COM" + number.ToString (), GENERIC_READ + GENERIC_WRITE, 
            0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);

        bool portExists = !h.IsInvalid;

        if (portExists)
            h.Close ();

        return portExists;
    }

    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    private static extern SafeFileHandle CreateFile (string lpFileName, System.UInt32 dwDesiredAccess, 
        System.UInt32 dwShareMode, IntPtr pSecurityAttributes, System.UInt32 dwCreationDisposition, 
        System.UInt32 dwFlagsAndAttributes, IntPtr hTemplateFile);
}
使用系统;
使用System.Collections.Generic;
使用Microsoft.Win32;
使用System.Runtime.InteropServices;
使用Microsoft.Win32.SafeHandles;
公共类MyClass
{
私有consuint GENERIC_ALL=0x10000000;
专用consuint GENERIC_READ=0x8000000;
专用consunt GENERIC_WRITE=0x40000000;
私有consuint GENERIC_EXECUTE=0x20000000;
私有const int OPEN_EXISTING=3;
public const int无效的句柄值=-1;
公共静态void Main()
{

对于其他人建议的(inti=1;i,您可以使用WMI。您可以找到一个示例


由于您使用的是.net 1.1,一个选项是使用AxMSCommLib控件

这是一个帮助我开始使用AxMSCommLib控件的网页。这里甚至列出了一个FindDevicePort()方法,可以轻松修改

此后,我切换到System.IO.Ports,它看起来更加健壮

谢谢


也许你会觉得这个有用

我向您展示了一种检查电脑中所有COM端口的简单方法。要开始使用,请执行以下步骤:

  • 在Visual Studio中创建WinForms应用程序
  • 在表单中添加一个组合框,并将其命名为comboBoxCOMPORT
  • 复制以下代码并粘贴在public Form1()方法(自动生成)之后

  • 运行应用程序并单击组合框上的下拉箭头以显示所有可用的COM端口

  • 上述方法适用于Edgeport USB到串行转换器以及虚拟端口。我在我的项目中实现了这一方法,并且工作顺利。请告诉我是否可以提供任何进一步的帮助。

    好的……有一个问题!这将告诉您应用程序是否有可用的端口。如果另一个应用程序捕获了某个端口,PortExists函数将eturn false。如果要获取硬件中可用端口的列表(即使被其他应用捕获),请使用PInvoke GetDefaultCommConfig()。可能您没有正确安装驱动程序。它是否出现在超级终端中?驱动程序已安装,其他软件可以连接到它们,包括超级终端。这些是基于FTDI USBserial的设备。我最终使用了以下答案中的QueryDosDevices:此代码在“foreach”行上产生错误在.net Framework 4.0.0上,是否有类似于此代码的Python版本?对于Python,您应该使用pyserial-它具有内置的查询com端口(请参阅-列出端口)
    try
    {
        ManagementObjectSearcher searcher =
            new ManagementObjectSearcher("root\\WMI",
            "SELECT * FROM MSSerial_PortName");
    
        foreach (ManagementObject queryObj in searcher.Get())
        {
            Console.WriteLine("-----------------------------------");
            Console.WriteLine("MSSerial_PortName instance");
            Console.WriteLine("-----------------------------------");
            Console.WriteLine("InstanceName: {0}", queryObj["InstanceName"]);
    
            Console.WriteLine("-----------------------------------");
            Console.WriteLine("MSSerial_PortName instance");
            Console.WriteLine("-----------------------------------");
            Console.WriteLine("PortName: {0}", queryObj["PortName"]);
    
            //If the serial port's instance name contains USB 
            //it must be a USB to serial device
            if (queryObj["InstanceName"].ToString().Contains("USB"))
            {
                Console.WriteLine(queryObj["PortName"] + " 
                is a USB to SERIAL adapter/converter");
            }
        }
    }
    catch (ManagementException e)
    {
        Console.WriteLine("An error occurred while querying for WMI data: " + e.Message);
    } 
    
    private void Form1_Load(object sender, EventArgs e)
    {
        string[] ports = SerialPort.GetPortNames();        
       comboBoxCOMPORT.Items.AddRange(ports);
    }