Подтвердить что ты не робот

С# проверьте, открыт ли COM-порт (Serial)

Есть ли простой способ программной проверки, если серийный COM-порт уже открыт/используется?

Обычно я бы использовал:

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

Однако я хотел бы запрограммировать программу, чтобы попытаться использовать другой COM-порт или некоторые из них.

4b9b3361

Ответ 1

Мне понадобилось что-то подобное некоторое время назад, чтобы найти устройство.

Я получил список доступных COM-портов, а затем просто повторил их, если он не выбрал исключение, которое я пытался связать с устройством. Немного грубо, но работает.

var portNames = SerialPort.GetPortNames();

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

Ответ 2

Вот как я это сделал:

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

Ответ 3

класс 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);
        }
    }
  }
}

Ответ 4

Вы можете попробовать использовать следующий код, чтобы проверить, открыт ли порт или нет. Я предполагаю, что вы не знаете, какой порт вы хотите проверить.

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