332 / 85 / 16
Регистрация: 10.01.2011
Сообщений: 516
Записей в блоге: 1
1

Определить, занят ли COM-порт

26.06.2014, 16:09. Показов 13297. Ответов 24
Метки нет (Все метки)

Добрый день! В программе используются несколько com портов. Как можно проверить используется ли порт какой либо программой, кроме как способом нового открытия?
Заранее спасибо!

Добавлено через 3 минуты
Если немного по подробнее.
Необходимо всегда держать с портом связь. Если он вдруг стал не доступен - оповестить и пытаться переподключиться. Так вот, при проверке способом нового открытия порта нельзя определить, открыт ли он моей программой или вообще отсутствует, так как в обоих случаях ошибка открытия.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.06.2014, 16:09
Ответы с готовыми решениями:

В конфигурационном файле прописан порт, но пишет ошибку порт 80 занят другим приложением
Здравствуйте. Пишу решение с 2 проектами - сервер и клиент с дуплексным контрактом. Служба...

Занят порт 80
Вчера обновился до windows 10. сегодня пытаюсь запустить сервер, пишет что порт 80 занят службами...

Занят порт
Написал WCF Library class, и пытаюсь его протестировать wcftestclient'ом, но получаю ошибку, что...

Узнать занят ли порт
Добрый день, подскажите плиииз. Нужна конструкция в баше типа if(port_used(3000)){ }else{} ...

24
пофигист широкого профиля
4544 / 3017 / 845
Регистрация: 15.07.2013
Сообщений: 17,424
26.06.2014, 16:33 2
Цитата Сообщение от xNeKiToSx Посмотреть сообщение
при проверке способом нового открытия порта нельзя определить, открыт ли он моей программой
А твоя программа что не знает сама какой она порт открыла?
0
332 / 85 / 16
Регистрация: 10.01.2011
Сообщений: 516
Записей в блоге: 1
26.06.2014, 16:42  [ТС] 3
знает
0
пофигист широкого профиля
4544 / 3017 / 845
Регистрация: 15.07.2013
Сообщений: 17,424
26.06.2014, 17:35 4
Тогда в чем проблема?
0
Пишу на Delphi...иногда
1421 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
26.06.2014, 19:03 5
Цитата Сообщение от xNeKiToSx Посмотреть сообщение
Если он вдруг стал не доступен
по какой причине это может возникнуть?
0
10226 / 6606 / 496
Регистрация: 28.12.2010
Сообщений: 21,160
Записей в блоге: 1
26.06.2014, 23:34 6
...например, при выдергивании шнурка-конвертора, драйвер которого эмулирует виртуальный COM-порт.

Так вот, при проверке способом нового открытия порта нельзя определить, открыт ли он моей программой или вообще отсутствует, так как в обоих случаях ошибка открытия.
открыт-ли вообще всегда лучше проверять путем открытия, через CreateFile() как вы и делаете. А вот наличие порта и даже на какой порт село виртуальное устройство - SetupAPI.

0
Пишу на Delphi...иногда
1421 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
26.06.2014, 23:44 7
Цитата Сообщение от raxp Посмотреть сообщение
например, при выдергивании шнурка-конвертора, драйвер которого эмулирует виртуальный COM-порт
это понятно, я к тому, что может проще реагировать на причину, а не на следствие?

обычно поступаю так:
1 подписываемся на сообщения подключения/отключения USB
2 при отключении USB проверяем наше ли это железо отключилось либо отсылкой железу какой-либо тестовой команды (если таковая имеется) либо проверкой наличия в системе порта на котором сидело железо (получение списка всех портов, присутствующих на данный момент и поиск в них того, на который подключено железо)
3 если выдернули наш порт говорим ОЙ, если не наш - продолжаем работать
0
10226 / 6606 / 496
Регистрация: 28.12.2010
Сообщений: 21,160
Записей в блоге: 1
26.06.2014, 23:55 8
...виртуальный COM порт может быть создан не только over USB, но и Ethernet (TCP). К примеру, MOXA драйвер в realmode.

1
2
3
излишне усложнено. Достаточно опрашивать сразу список с заданным временем таймаута и деактивировать свое подключение (закрывать порт) при отсутствии, при появлении в списке порта активировать (открывать порт).
0
Пишу на Delphi...иногда
1421 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
27.06.2014, 00:09 9
Цитата Сообщение от raxp Посмотреть сообщение
over USB, но и Ethernet (TCP)
USB - как пример, c TCP - таких требований не было, по сему не разбирался, но там также есть событийность INetworkEvents interface
Цитата Сообщение от raxp Посмотреть сообщение
излишне усложнено
кому как - кому-то проще постоянно периодически проверять, кому-то сделать один раз по сигналу системы, на вкус и цвет - фломастеры разные...
0
пофигист широкого профиля
4544 / 3017 / 845
Регистрация: 15.07.2013
Сообщений: 17,424
27.06.2014, 04:10 10
Цитата Сообщение от cotseec Посмотреть сообщение
это понятно, я к тому, что может проще реагировать на причину, а не на следствие?
Не в данном топике. Имхо ТС сам пока плохо понимает суть. А может уже и понимает только пока молчит.
С этими преобразователями USB-COM всегда будут проблемы.
0
2 / 2 / 0
Регистрация: 23.01.2013
Сообщений: 10
14.07.2014, 17:11 11
Лично я проверяю по таймауту, причем довольно часто (потому что у меня требования к софту: "выдернули-воткнули" - должно работать как будто ничего не произошло).
Алгоритм такой:
1. Проверка не пропал ли порт на уровне железа.
2. Закрываем этот порт.
3. Пытаемся открыть его заново или ждем реакции пользователя.
0
Житель Земли
2992 / 2981 / 391
Регистрация: 26.07.2011
Сообщений: 11,450
Записей в блоге: 1
05.02.2021, 17:01 12
Всем привет. У меня такой же вопрос, но с нюансами. Также сразу уточню, что работа с портами для меня - тёмный лес.

Итак, есть оборудование, которое может подключатся как по физическому порту, так и по USB через эмулированный СОМ. Если с физ. портом более-менее понятно, то с USB все не так просто. Даже если к выключенному устройству подключить кабель USB, винда сразу же эмулирует порт, поскольку в устройство встроена плата-драйвер, работающая независимо от наличия питания на устройстве (видимо, питание по USB, я не спец). Иными словами, проверка на наличие такого-то номера порта не подходит (устройство выключено, связи с ним нет, но порт присутствует). Общение с устройством происходит через OLE-менеджер, он тупой и корректной команды проверки связи с устройством не имеет. Когда я эмулирую аварийную ситуацию в виде отключения питания устройства - зависает наглухо.

Вопрос такой: какой можно придумать универсальный способ проверки порта в данном случае? Желательно также, чтобы не нужно было определять, физический это порт или эмулированный
0
Эксперт .NET
8560 / 5437 / 1294
Регистрация: 25.05.2015
Сообщений: 16,518
Записей в блоге: 14
05.02.2021, 17:06 13
Послать запрос и (не)получить ответ.
Напрямую в порт, не каким-то ole.

Определить тип можно по описаниям портов, врядли они у вас случайные.
0
Житель Земли
2992 / 2981 / 391
Регистрация: 26.07.2011
Сообщений: 11,450
Записей в блоге: 1
05.02.2021, 17:14 14
Цитата Сообщение от Rius Посмотреть сообщение
Послать запрос и (не)получить ответ.
Я не знаю, как это делать.

Цитата Сообщение от Rius Посмотреть сообщение
Определить тип можно по описаниям портов, врядли они у вас случайные.
драйвер порта называвется Silicon Labs CP210x USB to UART Bridge, если это имеет значение

Добавлено через 58 секунд
Цитата Сообщение от Rius Посмотреть сообщение
Напрямую в порт
типа пинг?

Добавлено через 4 минуты
Цитата Сообщение от Rius Посмотреть сообщение
Послать запрос
Имеется в виду "послать запрос согласно протоколу устройства" или есть универсальные команды проверки порта?
Если первый случай - то а) я не знаю протокола, б) я не умею с протоколами
0
Эксперт .NET
8560 / 5437 / 1294
Регистрация: 25.05.2015
Сообщений: 16,518
Записей в блоге: 14
05.02.2021, 17:18 15
См. USB RS485 и ардуино
В дельфях могут быть готовые компоненты, работающие поверх этого.

Да, имеет. Знакомый чип. Номер порта и описание можно вытащить в паре. Сразу будет понятно, что порт виртуальный.

Типа да.

Добавлено через 1 минуту
Согласно протоколу, конечно же.
Берите сниффер ком порта и смотрите, чем родная программа с девайсом обмениваются.
Или читайте документацию на девайс.
0
Житель Земли
2992 / 2981 / 391
Регистрация: 26.07.2011
Сообщений: 11,450
Записей в блоге: 1
05.02.2021, 18:54 16
Цитата Сообщение от Rius Посмотреть сообщение
Номер порта и описание можно вытащить в паре. Сразу будет понятно, что порт виртуальный.
Так а зачем мне это?

Последовательно.

- Включаю устройство
- Коннект через ОЛЕ (другого способа не имеем)
- При успешном коннекте я всегда знаю номер порта, на который подключено устройство (мало того, что я вручную указываю порт для связи, так ещё и менеждер любезно может сообщить мне номер порта)
- во время работы необходимо периодически проверять наличие связи. т.к. протокола я не знаю, а ОЛЕ не умеет, мне представляется это так:

Аварийная ситуация №1. Отключение питания
1. Если физический порт, он не исчезнет из списка устройств
2. Если эмулированный, тоже не исчезнет

Аварийная ситуация №2. Физическое отключение кабеля
1. Физичекий порт не исчезнет
2. Эмулированный пропадёт.

Таким образом, первым шагом может быть проверка наличия номера порта в системе. Допустим, мы выяснили, что порт присутствует (при аварии №1). Как дальше?

Добавлено через 54 секунды
Цитата Сообщение от Rius Посмотреть сообщение
Берите сниффер ком порта и смотрите, чем родная программа с девайсом обмениваются.
Не УМЕЮ я

Цитата Сообщение от Rius Посмотреть сообщение
Или читайте документацию на девайс.
Нет доступа к документации + см. пункт 1

Добавлено через 1 час 23 минуты
Я, может, что-то неясно описал. Знаю, врожденное косноязычие присутствует. Так я могу дать дополнительную информацию для понимания сути вопроса
0
пофигист широкого профиля
4544 / 3017 / 845
Регистрация: 15.07.2013
Сообщений: 17,424
06.02.2021, 02:20 17
Цитата Сообщение от DenNik Посмотреть сообщение
Всем привет. У меня такой же вопрос, но с нюансами.
Лучше бы завел новый топик.
И лучше сразу сказать что имеется в виду под
Цитата Сообщение от DenNik Посмотреть сообщение
Общение с устройством происходит через OLE-менеджер
Если это какой-то чёрный ящик, то вряд ли что-то нормальное получится.
0
Житель Земли
2992 / 2981 / 391
Регистрация: 26.07.2011
Сообщений: 11,450
Записей в блоге: 1
06.02.2021, 05:53 18
northener, честно, я прям растерялся и не знаю, в каком ключе отвечать. OLE-менеджер - это программный интерфейс от разработчика оборудования, позволяющий на прикладном уровне взаимодействовать с устройством. Надстройка над низкоуровневым протоколом. Прикладному программисту не надо знать, как открыть порт, послать туда запрос и т.д. Он пишет
CreateOleObject()
Connect()
и так далее

Я не железячник. Я не умею напрямую читать/писать в порт, все эти байт-статусы и т.д. Поэтому спрашиваю - можно ли на прикладном уровне определить, открыт порт или он потерял связь с внешним железом? Если нет, так и скажите
0
10 / 10 / 0
Регистрация: 29.06.2013
Сообщений: 93
07.02.2021, 00:16 19
Параллельно с вашим устройством подключить ещё одно, но с питанием от родного. Оно должно в ответ на посылку фразы: "здесь продается славянский шкаф ?" отвечать: "шкаф продан, есть никелированная кровать с тумбочкой".

Будем надеяться, что ваше устройство не будет воспринимать эту переписку как команду к запуску межконтинентального самоликвидатора.
0
Житель Земли
2992 / 2981 / 391
Регистрация: 26.07.2011
Сообщений: 11,450
Записей в блоге: 1
07.02.2021, 00:23 20
Пример кода, пожалуйста
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.02.2021, 00:23
Помогаю со студенческими работами здесь

Glassfish. Занят порт 4848
Всем привет. У меня стоит Ubuntu 14.05, попробовал поставить Glassfish 3.0.1 по вот этому мануалу и...

Прокси сервер. Порт занят
При запуске прокси сервера TcpListener на 80 порту, выходит ошибка Обычно разрешается только одно...

Как узнать кем занят порт
При запуске программы(не важно какой), выходит сообщение, порт 80 занят, тогда набираю netstat...

Установка Apache (занят порт 80 ntoskrnl.exe)
80 порт занят ntoskrnl.exe (файл ядра операционных систем семейства Windows NT) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru