web-dev-qa-db-fra.com

C # vérifier si un port COM (série) est déjà ouvert

Existe-t-il un moyen simple de vérifier par programme si un port COM série est déjà ouvert/utilisé?

Normalement j'utiliserais:

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

Cependant, je voudrais vérifier par programme afin de pouvoir utiliser un autre port COM ou un autre.

18
TK.

Il y a quelque temps, j'avais besoin de quelque chose de similaire pour rechercher un appareil.

J'ai obtenu une liste des ports COM disponibles et ensuite simplement itéré sur eux, s'il ne lève pas une exception, j'ai essayé de communiquer avec l'appareil. Un peu dur mais travaillant.

var portNames = SerialPort.GetPortNames();

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

Voici comment je l'ai fait:

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

puis plus tard

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

La classe SerialPort a une méthode Open , qui lève quelques exceptions ..__ La référence ci-dessus contient des exemples détaillés.

Voir aussi la propriété IsOpen .

Un test simple:

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

C'est ce qui a fonctionné pour moi.

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

Si vous devez capturer des exceptions SerialPort (Open): https://docs.Microsoft.com/en-us/dotnet/api/system.io.ports.serialport.open?view=netframework-4.7 .2

0
Dead Pool