Страницы

Поиск по вопросам

четверг, 19 декабря 2019 г.

Проверка наличия COM порта

#c_sharp #net


Как проверить подключён COM-порт или нет?
Например, пользователь выбрал COM 3, но во время работы этот порт был отключён.
Как грамотно выполнить проверку присутствует ли COM-порт и возможно ли его открыть?

На данный момент делаю вот так(пример):

SerialPort port = new SerialPort("COM 8");
string[] allport = SerialPort.GetPortNames();
bool stat = false;
for (int i = 0; i < allport.Length; i++)
{
    if (allport[i] == port.PortName)
    {
        stat = true;
        break;
    }
}
if (stat)
    port.Open();
else
    Console.WriteLine("{0} отключен.", port.PortName);


Но уверен, что данною операцию можно реализовать грамотней.
    


Ответы

Ответ 1



Насколько я понимаю, порт может быть отключён в любой момент. Поэтому я бы делал так: работал с портом как обычно, а при приходе IOException говорил бы пользователю о проблемах при коммуникации с портом. Проверять можно через using System.IO.Ports; var port = new SerialPort("COM99"); port.Open(); // бросает исключение, если порта нет или SerialPort.GetPortNames().Contains("COM99") (как делаете это вы). Но отлова исключений всё равно не избежать, т. к. порт может появиться или исчезнуть сразу после проверки.

Ответ 2



Ваш код можно немного изменить используя метод Any(...). Можно создать вот такой метод, который принимает имя порта, проверяет, содержится ли это имя в списке имен последовательных портов текущего компьютера, а затем уже попытаемся открыть порт: static void OpenPort(string portName) { if (SerialPort.GetPortNames().Any(x => x == portName)) { // если такой порт есть, то попробуем открыть его и сделать что-то еще... var port = new SerialPort(portName); try { port.Open(); // здесь может быть код еще... } catch (Exception ex) { // что-то пошло не так и упало исключение... Выведем сообщение исключения Console.WriteLine(string.Format("Port:'{0}' Error:'{1}'", portName, ex.Message)); } } } А затем просто вызывать этот метод, передавая туда имя интересующего вас порта. Метод SerialPort.GetPortNames() - возвращает массив имен последовательных портов для текущего компьютера.

Комментариев нет:

Отправить комментарий