2016-10-05 7 views
0

У меня есть процесс, который запускает сбор данных с использованием 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() не держит возвращающиеся к нулю ... независимо часа много данных на устройстве!

Ожидается ли такое поведение и его всегда следует учитывать, случается ли это или не происходит?

+0

Сложно сказать, в чем проблема, поскольку это может быть связано с проблемами конфигурации (baudRate/Parity) или даже с устройством. Само собой, один вопрос: вы спите в своем цикле? возможно, вы «наводняете» устройство запросами и можете справиться с ним. –

+0

@KobiK На самом деле нет. Я не спал в цикле. Поскольку я хочу, чтобы все данные были доступны как можно быстрее, в то время как устройство ставит в очередь только 16 Кбайт данных. –

+0

Если это только 'inWaiting()', тогда это не должно быть проблемой, но если вы отправляете команды, это другой случай. Как я сказал, трудно ответить, поскольку это могут быть проблемы с оборудованием. –

ответ

0

Проблема значительно сократилась после того, как вы не набрали inWaiting() очень часто. Во всяком случае, я сохранил часть повторного подключения, чтобы гарантировать, что моя программа никогда не сработает. Спасибо за «Kobi K» за то, что вы указали возможную причину проблемы.