Как сделать проверку на наличие 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()