如何找到可用的COM端口?

时间:2009-07-04 09:25:07

标签: c# serial-port

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

9 个答案:

答案 0 :(得分:30)

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

在2.0中有一个静态函数

SerialPort.GetPortNames()

http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.getportnames.aspx

答案 1 :(得分:11)

正如其他人所说,您可以使用WMI。您可以找到示例in CodeProject

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);
} 

答案 2 :(得分:8)

也可以在注册表中HKEY_LOCAL_MACHINE\hardware\devicemap\serialcomm项的值处找到可用的串行端口。

答案 3 :(得分:3)

如何从操作系统直接提问:

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);
}

答案 4 :(得分:1)

WMI包含大量硬件信息。查询Win32_SerialPort

的实例

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

答案 5 :(得分:1)

.net v1.1中不支持SerialPort通信。最常见的解决方案是使用VB6.0安装中的MSCOMMCTL主动X控件(从添加引用对话框导入到.net项目中作为COM组件)。

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

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

答案 6 :(得分:1)

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

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

我已经切换到System.IO.Ports,它看起来更强大。

http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=320

由于

答案 7 :(得分:1)

也许您会发现这很有用?

我向您展示了一种检查PC中所有COM端口的简单方法。要开始,请按照以下步骤操作:

  1. 在Visual Studio中创建WinForms应用程序。
  2. 在您的表单中拖放一个comboBox并将其命名为comboBoxCOMPORT
  3. 复制以下代码,并粘贴到公共Form1()方法(自动生成)之后。

    private void Form1_Load(object sender, EventArgs e)
    {
        string[] ports = SerialPort.GetPortNames();        
       comboBoxCOMPORT.Items.AddRange(ports);
    }
    
  4. 运行该应用程序,然后单击comboBox上的下拉箭头以显示所有可用的COM PORTS。

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

答案 8 :(得分:0)

使用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