Python PySerial.Как узнать, открыт ли порт уже?

#pyserial

#pyserial

Вопрос:

Я пытаюсь написать приложение, которое использует последовательные порты на ПК с Linux, используя python и PySerial. Но на этом КОМПЬЮТЕРЕ есть другие приложения, использующие последовательные порты. Как я могу узнать, открыт ли порт уже другим приложением, прежде чем пытаться его использовать?

Спасибо

Ответ №1:

Кажется, плохо документировано на веб-сайте PySerial, это работает для меня:

 ser = serial.Serial(DEVICE,BAUD,timeout=1)
if(ser.isOpen() == False):
    ser.open()
  

Немного надуманный пример, но идею вы уловили.
Я знаю, что этот вопрос задавался давным-давно, но у меня был тот же вопрос сегодня, и я подумал, что любой другой, кто найдет эту страницу, был бы признателен за ответ.

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

1. Просто понял, что вопрос задавал что-то немного отличное от этого, но я надеюсь, что этот ответ все равно будет полезен!

2. Я только что нашел это — первое место в списке в Google, в августе 2017. Спасибо, что опубликовали это так, как вы это сделали. Это точно ответило на мой вопрос. В моем случае это означает, что программа уже запущена. Я использую ssh для подключения к компьютерам, и иногда у меня есть программа регистрации данных ssx , запущенная с консоли. Теперь Python может использовать это, чтобы обнаружить его без простого прерывания, и использовать os.system("killall ssx") для остановки другого порта самостоятельно. Это происходит только тогда, когда я вношу изменения, но мне этого было достаточно для поиска. И вот вы здесь. спасибо.

Ответ №2:

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

 import serial

try:
  ser = serial.Serial( # set parameters, in fact use your own :-)
    port="COM4",
    baudrate=9600,
    bytesize=serial.SEVENBITS,
    parity=serial.PARITY_EVEN,
    stopbits=serial.STOPBITS_ONE
  )
  ser.isOpen() # try to open port, if possible print message and proceed with 'while True:'
  print ("port is opened!")

except IOError: # if port is already opened, close it and open it again and print message
  ser.close()
  ser.open()
  print ("port was already open, was closed and opened again!")

while True: # do something...
  

Ответ №3:

Проверьте возвращаемый вывод Serial.serial, он возвращает недопустимое исключение, которое может быть перехвачено.

Документация по API
Документация по исключениям

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

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

1. Ссылки на sourceforge мертвы, Джим. Да здравствуют постоянные ссылки (или отвечайте на вопрос напрямую, а не через ссылку на другую страницу).