Есть ли способ принудительно закрыть открытое устройство COM-порта? - PullRequest
0 голосов
/ 12 июня 2019

Используя Python, мне нужно принудительно закрыть COM-порт, который был открыт другой программой. Я не могу закрыть COM-порт, потому что не могу инициировать с ним сеанс, поскольку он уже открыт где-то еще.

import visa

rm = visa.ResourceManager()

# list all the COM ports connected to PC
print(rm.list_resources())

# open a device session on one COM port
dev = rm.open_resource('COM12')
# this can't be done if the 'COM12' is already opened somewhere else

# I need to close 'COM12' like this
# but can't access it because its already opened
dev.close()

Есть ли способ принудительно закрыть сеанс, например «COM12», если он был открыт в другой программе? Когда другое программное обеспечение (LabVIEW) сталкивается с ошибкой, оно падает и часто оставляет COM-порты открытыми, что не позволяет мне получить к ним доступ без ручного выключения физического устройства. Было бы неплохо заставить их закрыться, чтобы их можно было снова правильно открыть.

Ответы [ 2 ]

2 голосов
/ 21 июня 2019

Я почти уверен, что в случае сбоя LabVIEW операционная система освобождает все аппаратные ресурсы от своего имени.

Но имейте в виду, что LabVIEW - это среда выполнения, в которой работают дочерние программы. Таким образом, если дочерняя программа была прервана, сам процесс LabVIEW может все еще выполняться. Было бы легко написать небольшую программу LabVIEW, которая вызывает VISA Close на COM12 в среде LabVIEW и которая должна помочь. Вы также можете выйти из процесса LabVIEW.

Наконец, я иногда видел драйверы последовательных устройств (особенно для нестандартных последовательных портов, таких как те, которые используют USB или Ethernet), которые сталкиваются с проблемами, если ваша программа не делает все идеально, например, изящный вызов близко. В этих случаях иногда приходится перезагружаться, чтобы драйвер устройства перешел в правильное состояние.

1 голос
/ 14 июня 2019

Хотя у меня нет однозначного ответа, я почти уверен, что это так. Нет. Как и в случае, нет хорошего способа сделать это.

Аппаратные ресурсы обрабатываются операционной системой.И если один процесс открывает ресурс и не освобождает его, вы не можете просто пойти и украсть его «без согласия».Это может привести к сбою другого процесса.Какие операционные системы должны предотвращать.

Вы можете «убить» другой процесс, используя API операционной системы.Но сначала вы должны идентифицировать его как тот, который удерживает блокировку на данном ресурсе - что будет темой другого вопроса.

...