В большинстве ответов предлагается 2 подхода:
- В какой-то момент кода отправьте какое-то сообщение через последовательный порт, чтобы проверить, живо ли ваше устройство.
- Запустите отдельный поток и постоянно проверяйте, живо ли устройство, открывая сообщение
Проблема с первым решением заключается в том, что вы не всегда проверяете соединение, а проверяете только некоторые конкретные моменты: это решение не очень элегантно и, если оно написано плохо, может даже не работать.
Второе решение решает проблему первого решения, но создает новую проблему: проверка соединения или, в худшем случае, отправка сообщения в поточном цикле вызовет проблему или может даже прервать соединение с устройством из других функций.
Решение, позволяющее постоянно проверять соединение без монополизации коммуникации, предполагает чтение существующего COM:
import serial.tools.list_ports
myports = [tuple(p) for p in list(serial.tools.list_ports.comports())]
print myports
вывод:
[(u'COM3', u'Arduino Due Programming Port (COM3)', u'some more data...'),
(u'COM6', u'USB Serial Port (COM6)', u'some more data...'),
(u'COM100', u'com0com - serial port emulator (COM100)', u'some more data...')]
затем мы сохраняем кортеж, содержащий наш порт:
arduino_port = [port for port in myports if 'COM3' in port ][0]
затем мы создаем функцию, которая проверяет, присутствует ли еще этот порт:
import time
def check_presence(correct_port, interval=0.1):
while True:
myports = [tuple(p) for p in list(serial.tools.list_ports.comports())]
if arduino_port not in myports:
print "Arduino has been disconnected!"
break
time.sleep(interval)
Наконец, мы запускаем эту функцию как поток демона:
import threading
port_controller = threading.Thread(target=check_presence, args=(arduino_port, 0.1,))
port_controller.setDaemon(True)
port_controller.start()
таким образом, вы будете проверять каждые 0,1 секунды, если Arduino все еще подключен, и поток завершится, когда Arduino будет отключен или все другие действия завершатся
person
Gsk
schedule
23.03.2018