Как сделать проверку на наличие COM порта в системе?

Есть функция, которая в бесконечном цикле читает некоторые данные из COM порта. Нужно сделать так, чтобы при обрыве связи(пропадании COM порта в системе) функция ожидала появления порта и продолжала считывать данные. Если кто-то может помочь - буду безмерно благодарен. С except бился весь день - лучший результат это зависание цикла при следующем коде:

    def read_com_port():
        ser = serial.Serial('COM4', baudrate=9600, timeout=0)  # настройка порта
        while True:
            try:
                lines = ser.readline()
                print(lines.decode('UTF-8').strip())
                lines1 = str(lines.decode('UTF-8'))
                lines1 = lines1.rstrip()
                if lines1.split('=', 1)[0] == 'gerkon_down':
                    print('match!!! gerkon_down = ' + str(lines1.split('=', 1)[1]))
                if lines1.split('=', 1)[0] == 'gerkon_up':
                    print('match!!! gerkon_up = ' + str(lines1.split('=', 1)[1]))
                if lines1.split('=', 1)[0] == 'gerkon_alarm':
                    print('match!!! gerkon_alarm = ' + str(lines1.split('=', 1)[1]))
                if lines1.split('=', 1)[0] == 'Position relay1_on_off':
                    print('match!!! Position relay1_on_off = ' + str(lines1.split('=', 1)[1]))
                if lines1.split('=', 1)[0] == 'Position relay2':
                    print('match!!! Position relay2 = ' + str(lines1.split('=', 1)[1]))
                if lines1.split('=', 1)[0] == 'Position relay3_alarm':
                    print('match!!! Position relay3_alarm = ' + str(lines1.split('=', 1)[1]))
                if lines1.split('=', 1)[0] == 'status':
                    print('match!!! status = ' + str(lines1.split('=', 1)[1]))
                if not lines:
                    sleep(2.0)
            except Exception as e:
                continue
                pass
run = read_com_port()

Попробовал сделать по совету @eri, но к сожалению при отключении COM порта сразу же вылетает с exception. Новый код:

def read_com_port():
  while True:
    ser = serial.Serial('COM4', baudrate=9600, timeout=0)  # настройка порта
    while True:
        try:
            lines = ser.readline()
            print(lines.decode('UTF-8').strip())
            lines1 = str(lines.decode('UTF-8'))
            lines1 = lines1.rstrip()
            if lines1.split('=', 1)[0] == 'gerkon_down':
                print('match!!! gerkon_down = ' + str(lines1.split('=', 1)[1]))
            if lines1.split('=', 1)[0] == 'gerkon_up':
                print('match!!! gerkon_up = ' + str(lines1.split('=', 1)[1]))
            if lines1.split('=', 1)[0] == 'gerkon_alarm':
                print('match!!! gerkon_alarm = ' + str(lines1.split('=', 1)[1]))
            if lines1.split('=', 1)[0] == 'Position relay1_on_off':
                print('match!!! Position relay1_on_off = ' + str(lines1.split('=', 1)[1]))
            if lines1.split('=', 1)[0] == 'Position relay2':
                print('match!!! Position relay2 = ' + str(lines1.split('=', 1)[1]))
            if lines1.split('=', 1)[0] == 'Position relay3_alarm':
                print('match!!! Position relay3_alarm = ' + str(lines1.split('=', 1)[1]))
            if lines1.split('=', 1)[0] == 'status':
                print('match!!! status = ' + str(lines1.split('=', 1)[1]))
            if not lines:
                sleep(2.0)
        except Exception as e:
            break
    sleep(1.0)


run = read_com_port()

Ошибка:

Traceback (most recent call last):
  File "D:/Java work/eclipse/test/New_vision/Testing/reading_COM.py", line 77, in <module>
    run = read_com_port()
  File "D:/Java work/eclipse/test/New_vision/Testing/reading_COM.py", line 48, in read_com_port
    ser = serial.Serial('COM4', baudrate=9600, timeout=0)  # настройка порта
  File "C:\Users\Noutbook\AppData\Local\Programs\Python\Python38\lib\site-packages\serial\serialwin32.py", line 33, in __init__
    super(Serial, self).__init__(*args, **kwargs)
  File "C:\Users\Noutbook\AppData\Local\Programs\Python\Python38\lib\site-packages\serial\serialutil.py", line 244, in __init__
    self.open()
  File "C:\Users\Noutbook\AppData\Local\Programs\Python\Python38\lib\site-packages\serial\serialwin32.py", line 64, in open
    raise SerialException("could not open port {!r}: {!r}".format(self.portstr, ctypes.WinError()))
serial.serialutil.SerialException: could not open port 'COM4': FileNotFoundError(2, 'Не удается найти указанный файл.', None, 2) 

Ответы (1 шт):

Автор решения: eri

Добавь ещё один while True перед подключением порта и в конце после вложенного цикла sleep(1). В эксепшан напишите break вместо continue

def read_com_port():
    while True:
        try:
            ser = serial.Serial('COM4', baudrate=9600, timeout=0)
        except Exception as e:
            print('open error', e)
            sleep(1.0)
        while True:
            try:
                lines = ser.readline()
                parse(lines) #вынеси в функцию
                if not lines:
                    sleep(2.0)
            except Exception as e:
                print('read error', e)
                break

run = read_com_port()
→ Ссылка