C# com (Serial) 포트가 이미 열려 있는지 확인
-
10-07-2019 - |
문제
직렬 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 **/
}
}
제휴하지 않습니다 StackOverflow