Проверка открытых COM-портов

      На сегодняшний день популярными портами в новых компьютерах стали USB, а СОМ – порт почти полностью вышел из эксплуатации. Тем не менее, устройства использующие СОМ – порт не остались в стороне. Они поддерживаются производителями и не потеряли популярности на производствах. Где нужен обмен информацией между различными современными устройствами (сбор информации, контроль управления).
      В недалеком прошлом для работы с последовательными портами (COM) в среде .Net 1.1, необходимо было использовать либо «Windows API», либо управление из сторонних библиотек. В среде .Net 2.0 (и в более поздних версиях .NET) компания Microsoft реализовала весь необходимый функционал для работы с последовательным портом включением класса «SerialPort» как части пространства имен «System.IO.Ports».

      Последовательный порт (англ. serial port, COM-порт, англ. communications port) — сленговое название интерфейса стандарта RS-232, которым массово оснащались персональные компьютеры. Последовательным данный порт называется потому, что информация через него передаётся по одному биту, бит за битом (в отличие от параллельного порта).
      Для получения списка всех COM-портов компьютера можно воспользоваться статическим методом «GetPortNames» класса «SerialPort» и оператора «foreach». Этот оператор обрабатывает все элементы массива имен последовательных портов для текущего компьютера в том порядке, в котором его возвращает метод «GetPortNames».
foreach (string str in System.IO.Ports.SerialPort.GetPortNames())
      В результате этого вызова при обработке массива в переменной «str» будет содержаться имя COM-порта локальной машины. Перед проверкой конкретного COM-порта нужно сначала создать объект класса SerialPort с указанием имени порта.
System.IO.Ports.SerialPort Port;
Port = new System.IO.Ports.SerialPort(str);
      Для проверки состояния порта, необходимо воспользоваться методом «SerialPort.Open», данный метод открывает новое соединение последовательного порта. После открытия нового соединения необходимо воспользоваться свойством «SerialPort.IsOpen», возвращающее значение, указывающее состояние объекта SerialPort — открыт или закрыт. После проверки состояния необходимо закрыть соединение, вызвав метод «Close».
Port.Close();
      Создайте проект «Windows Form» в «Microsoft Visual Studio» и добавьте на главную форму вашего проекта следующие элементы управления:
  • System.Windows.Forms.Button button1 – элемент управления для запуска процесса поиска открытых портов;
  • System.Windows.Forms.ListBox listBox1 – элемент управления для вывода имен открытых портов.
У вас получится приведенный ниже пример.
      Сделайте двойной клик левой клавишей мыши по элементу управления «button1». Вы перейдете в редактор кода с автоматической установкой курсора в созданном методе «button1_Click», события «Click», возникающего при нажатии на кнопку. Добавьте в тело данного метода приведенный ниже листинг, вызова метода проверки открытых портов компьютера.
//Выполняем очистку listBox1
listBox1.Items.Clear();
//Если порты найдены, то
//программа выдаст сообщение
if (IsPortOpen())
    MessageBox.Show("Найдены открытые порты!",
        "Сканирование портов",
        MessageBoxButtons.OK,
        MessageBoxIcon.Information);
else
    MessageBox.Show("Открытые порты не найдены!",
        "Сканирование портов",
        MessageBoxButtons.OK,
        MessageBoxIcon.Information);
Так же добавьте в листинг главной формы сам метод.
public bool IsPortOpen()
{
    //Создаем переменную для возврата 
    //состояния получения портов.
    //true в случае успешного получения 
    //false если порты не найдены.
    bool available = false;

    //Представляет ресурс последовательного порта.
    System.IO.Ports.SerialPort Port;

    //Выполняем проход по массиву имен 
    //последовательных портов для текущего компьютера
    //которые возвращает функция SerialPort.GetPortNames().
    foreach (string str in System.IO.Ports.SerialPort.GetPortNames())
    {
        try
        {
            Port = new System.IO.Ports.SerialPort(str);
            //Открываем новое соединение последовательного порта.
            Port.Open();

            //Выполняем проверку полученного порта
            //true, если последовательный порт открыт, в противном случае — false.
            //Значение по умолчанию — false.
            if (Port.IsOpen)
            {
                //Если порт открыт то добавляем его в listBox
                listBox1.Items.Add(str);

                //Уничтожаем внутренний объект System.IO.Stream.
                Port.Close();

                //возвращаем состояние получения портов
                available = true;
            }
        }
        //Ловим все ошибки и отображаем, что открытых портов не найдено               
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString(), "Ошибка при сканировании!",
                   MessageBoxButtons.OK, MessageBoxIcon.Error);                    
        }
    }
    //возвращаем состояние получения портов
    return available;
}
      Запустите проект, нажав на клавишу «F5». После успешной компиляции и запуска вашего проекта у вас откроется главная форма вашего проекта, нажмите кнопку «Сканировать». После завершения сканирования, вы получите сообщение с информацией о результате, а так же список открытых портов, если такие были найдены.
      В случае если COM-порт уже используется другим процессом, то при попытке его открыть вы получите исключение: Невозможно открыть com порт. Чтобы определить, кто именно держит порт, нужно воспользоваться утилитой для мониторинга ресурсов процессов.

5 комментариев:

  1. Написал как будто в насмешку,вроде бы здесь все програмисты

    ОтветитьУдалить
  2. Что в данном посте вас не устраивает?

    ОтветитьУдалить
  3. Что в данном посте вас не устраивает?

    ОтветитьУдалить
  4. Прикрепите исходики, в статьях нет какую кнопку как назвали т.е. действия

    ОтветитьУдалить
  5. По вашей просьбе в пост добавлен исходник!

    ОтветитьУдалить

Большая просьба, не писать в комментариях всякую ерунду не по теме!