C#检查COM(串行)端口是否已打开

是否有一种简单的方法可以以编程方式检查串行COM端口是否已打开/正在使用?

通常我会用:

try { // open port } catch (Exception ex) { // handle the exception } 

但是,我想以编程方式检查,以便我可以尝试使用另一个COM端口或其他类似的端口。

我不久前需要类似的东西来搜索设备。

我获得了一个可用的COM端口列表,然后简单地迭代它们,如果它没有抛出exception,我试图与设备通信。 有点粗糙但有效。

 var portNames = SerialPort.GetPortNames(); foreach(var port in portNames) { //Try for every portName and break on the first working } 

这就是我做的方式:

  [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] internal static extern SafeFileHandle CreateFile(string lpFileName, int dwDesiredAccess, int dwShareMode, IntPtr securityAttrs, int dwCreationDisposition, int dwFlagsAndAttributes, IntPtr hTemplateFile); 

然后是

  int dwFlagsAndAttributes = 0x40000000; var portName = "COM5"; var isValid = SerialPort.GetPortNames().Any(x => string.Compare(x, portName, true) == 0); if (!isValid) throw new System.IO.IOException(string.Format("{0} port was not found", portName)); //Borrowed from Microsoft's Serial Port Open Method :) SafeFileHandle hFile = CreateFile(@"\\.\" + portName, -1073741824, 0, IntPtr.Zero, 3, dwFlagsAndAttributes, IntPtr.Zero); if (hFile.IsInvalid) throw new System.IO.IOException(string.Format("{0} port is already open", portName)); hFile.Close(); using (var serialPort = new SerialPort(portName, 115200, Parity.None, 8, StopBits.One)) { serialPort.Open(); } 

SerialPort类有一个Open方法,它会抛出一些例外。 上面的参考包含详细的例子。

另请参见IsOpen属性。

一个简单的测试:

 using System; using System.IO.Ports; using System.Collections.Generic; using System.Text; namespace SerPort1 { class Program { static private SerialPort MyPort; static void Main(string[] args) { MyPort = new SerialPort("COM1"); OpenMyPort(); Console.WriteLine("BaudRate {0}", MyPort.BaudRate); OpenMyPort(); MyPort.Close(); Console.ReadLine(); } private static void OpenMyPort() { try { MyPort.Open(); } catch (Exception ex) { Console.WriteLine("Error opening my port: {0}", ex.Message); } } } } 

这对我有用。

 private string portName { get; set; } = string.Empty; ///  /// Returns SerialPort Port State (Open / Closed) ///  ///  internal bool HasOpenPort() { bool portState = false; if (portName != string.Empty) { using (SerialPort serialPort = new SerialPort(portName)) { foreach (var itm in SerialPort.GetPortNames()) { if (itm.Contains(serialPort.PortName)) { if (serialPort.IsOpen) { portState = true; } else { portState = false; } } } } } else { System.Windows.Forms.MessageBox.Show("Error: No Port Specified."); } return portState; } 

如果您需要捕获SerialPort(开放)例外: https ://docs.microsoft.com/en-us/dotnet/api/system.io.ports.serialport.open?view = networkframe-4.7.2

您可以尝试使用以下代码来检查端口是否已打开。 我在假设您不知道具体哪个端口要检查。

 foreach (var portName in Serial.GetPortNames() { SerialPort port = new SerialPort(portName); if (port.IsOpen){ /** do something **/ } else { /** do something **/ } }