如何找到可用的COM端口?

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

正如其他人建议的那样,您可以使用WMI。 您可以在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); } 

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

在2.0中有一个静态函数

 SerialPort.GetPortNames() 

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

可以在注册表中HKEY_LOCAL_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); } 

WMI包含许多硬件信息。 查询Win32_SerialPort的实例。

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

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

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

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

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

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

我已经切换到System.IO.Ports,它似乎更强大。

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

谢谢

也许你会发现这有用吗?

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

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

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

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

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