С# проверьте, открыт ли COM-порт (Serial)
Есть ли простой способ программной проверки, если серийный COM-порт уже открыт/используется?
Обычно я бы использовал:
try
{
// open port
}
catch (Exception ex)
{
// handle the exception
}
Однако я хотел бы запрограммировать программу, чтобы попытаться использовать другой COM-порт или некоторые из них.
Ответы
Ответ 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 **/
}
}