У меня есть процесс, который запускает сбор данных с использованием PySerial. Теперь он работает нормально, но есть странная вещь, которую я должен был сделать, чтобы она работала непрерывно, и я не уверен, что это нормально, поэтому я задаю этот вопрос.Python: PySerial отключается от устройства случайным образом
Что происходит: Похоже, что соединение падает время от времени! Примерно один раз каждые 30-60 минут, с большими барами ошибок (может продолжаться часами и быть в порядке, но иногда бывает часто).
Мой вопрос: Является ли этот стандарт?
Мое временное решение: Я написал простую функцию «возобновлять», который выглядит следующим образом:
def ReopenDevice(devObject):
try:
devObject.close()
devObject.open()
except Exception as e:
print("Error while trying to connect to device " + devObject.port + ". The error says: " + str(e))
time.sleep(2)
И что я делаю, что если вытягивать данные не удается в течение 2 минут, я снова открыть устройство с этим и он продолжает работать без проблем.
Моя модель программы: Это программа GUI, когда пользователь нажимает что-то вроде «Start», и что кнопка делает некоторые препараты и запускает функцию через multiprocessing.Process()
, который начинается с:
devObj = serial.Serial()
#... other params
devObj.open()
и что затем функция запускает время цикла, который держит данные опроса что-то вроде:
bytesToRead = devObj.inWaiting()
if bytesToRead != 0:
buffer = decodeString(devObj.read(bytesToRead))
#process buffer and push it to a list...
так, как я знаю, что проблема случилась, что devObj.inWaiting()
не держит возвращающиеся к нулю ... независимо часа много данных на устройстве!
Ожидается ли такое поведение и его всегда следует учитывать, случается ли это или не происходит?
Сложно сказать, в чем проблема, поскольку это может быть связано с проблемами конфигурации (baudRate/Parity) или даже с устройством. Само собой, один вопрос: вы спите в своем цикле? возможно, вы «наводняете» устройство запросами и можете справиться с ним. –
@KobiK На самом деле нет. Я не спал в цикле. Поскольку я хочу, чтобы все данные были доступны как можно быстрее, в то время как устройство ставит в очередь только 16 Кбайт данных. –
Если это только 'inWaiting()', тогда это не должно быть проблемой, но если вы отправляете команды, это другой случай. Как я сказал, трудно ответить, поскольку это могут быть проблемы с оборудованием. –