Frage

Gibt es eine einfache Möglichkeit, programmatisch zu überprüfen, ob eine serielle COM-Schnittstelle ist bereits geöffnet / verwendet?

Normalerweise würde ich verwenden:

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

Allerdings würde Ich mag programmatisch so überprüfen, ich kann versuchen, einen anderen COM-Port oder so zu verwenden.

War es hilfreich?

Lösung

Ich brauchte etwas ähnliches vor einiger Zeit für ein Gerät zu suchen.

erhielt ich eine Liste des verfügbaren COM-Ports und dann einfach über sie wiederhole, wenn es nicht eine Ausnahme hat ich versucht zu werfen hat mit dem Gerät zu kommunizieren. Ein wenig rau, aber arbeiten.

var portNames = SerialPort.GetPortNames();

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

Andere Tipps

Dies ist, wie ich es getan hätte:

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

dann später

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

Die Serialport-Klasse eine hat Öffnen Methode, die bis auf wenige Ausnahmen werfen. Die Referenz oben enthält detaillierte Beispiele.

Siehe auch die IsOpen Eigenschaft.

Ein einfacher Test:

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

Das ist was für mich gearbeitet.

private string portName { get; set; } = string.Empty;

    /// <summary>
    /// Returns SerialPort Port State (Open / Closed)
    /// </summary>
    /// <returns></returns>
    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;
    }

Falls Sie benötigen Serialport (Open) Ausnahmen fangen: https: //docs.microsoft.com/en-us/dotnet/api/system.io.ports.serialport.open?view=netframework-4.7.2

Sie können versuchen, Code folgenden zu überprüfen, ob ein Port bereits geöffnet ist oder nicht. Ich assumming Sie wissen nicht specificaly welchen Port Sie überprüfen möchten.

foreach (var portName in Serial.GetPortNames()
{
  SerialPort port = new SerialPort(portName);
  if (port.IsOpen){
    /** do something **/
  }
  else {
    /** do something **/
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top