문제

직렬 COM 포트가 이미 열려 있고 사용 중인지 프로그래밍 방식으로 쉽게 확인하는 방법이 있습니까?

일반적으로 나는 사용합니다 :

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

그러나 다른 COM 포트 나 그와 같은 것을 사용하려고 시도 할 수 있도록 프로그래밍 방식으로 확인하고 싶습니다.

도움이 되었습니까?

해결책

기기를 검색하기 위해 얼마 전에 비슷한 것이 필요했습니다.

사용 가능한 COM 포트 목록을 얻은 다음 예외를 던지지 않으면 장치와 통신하려고 시도했습니다. 조금 거칠지 만 작동합니다.

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

그만큼 시리얼 포트 클래스 있습니다 열려 있는 몇 가지 예외를 던질 방법. 위의 참조에는 자세한 예제가 포함되어 있습니다.

참조 이소펜 재산.

간단한 테스트 :

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;

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

Serialport (Open) 예외를 포착 해야하는 경우 :https://docs.microsoft.com/en-us/dotnet/api/system.io.ports.serialport.open?view=netframework-4.7.2

포트가 이미 열려 있는지 여부를 확인하기 위해 Folloing 코드를 시도 할 수 있습니다. 나는 당신이 어떤 포트를 확인하려는 포트를 구체적으로 알지 못한다고 가정합니다.

foreach (var portName in Serial.GetPortNames()
{
  SerialPort port = new SerialPort(portName);
  if (port.IsOpen){
    /** do something **/
  }
  else {
    /** do something **/
  }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top