проблема с последовательным чтением python после периода бездействия

У меня есть плата Arduino, которая постоянно сбрасывает значения на последовательный порт (USB). Эти данные считываются машиной с помощью скрипта Python с использованием библиотеки pySerial. Код, который я использовал, выглядит следующим образом:

import serial
import time

ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)

while True:
        ser.flushInput() #Clear the serial input buffer
        print "Value:"
        print ser.readline()
        print ser.readline()
        print ser.readline()

        time.sleep(30) #Wait for 30 seconds

Это работает отлично и дает следующий результат:

Value:

162

162

162

Value:

162

162

162

Но когда я даю в цикле гораздо большую задержку, чем 30 секунд, скажем, 1 минуту или больше:

time.sleep(60) #Wait for 60 seconds

Я начинаю получать проблемы. Печатается 1-й набор значений. С этого момента ser.readline() всегда выдает нулевые значения!

Выход:

Value:
162

162

162

Value:



Value:

Почему последовательный модуль показывает такое поведение?

Первоначально машина, которую я использовал для считывания серийных значений, была платой Raspberry Pi под управлением Raspian Linux. Я думал, что проблема может быть связана с тем, что RPi переводит USB в спящий режим с низким энергопотреблением, когда он сталкивался с периодом простоя. Но я протестировал тот же код на своем ноутбуке, и там возникла та же проблема, подразумевая, что это может быть какая-то другая проблема.

Я хотел создать систему, которая должна работать круглосуточно и без выходных и считывать последовательные значения при возникновении определенных событий, поэтому такое поведение неприемлемо.

Пожалуйста, пролейте свет на этот вопрос.


person Nabeel    schedule 02.10.2013    source источник
comment
Зачем вам нужна инструкция time.sleep(30) в конце?   -  person Aryaveer    schedule 02.10.2013
comment
Это просто тестовый код. Реальная система, которую я хочу, должна работать примерно так: 1. Дождитесь события 1 2. Если произойдет событие 1, получите последовательные значения, пока не произойдет событие 2 3. Продолжайте повторять шаги 1 и 2. Событие 1, которое я ищу, происходит не очень часто. . Таким образом, после завершения шага 2 может потребоваться более 1 минуты для следующего возникновения события Event1, после чего последовательное чтение дает мне нулевые значения. Задержка в приведенном выше тестовом коде моделирует задержку ожидания события Event1. Если оно превышает 1 минуту, система не работает должным образом!   -  person Nabeel    schedule 02.10.2013
comment
Я не смог создать такую ​​​​настройку ... не смог проверить. Но вы попробуете оператор ser.inWaiting() в цикле и посмотрите, что он возвращает в этом случае.   -  person Aryaveer    schedule 02.10.2013


Ответы (1)


Вы можете попробовать прочитать что-то вроде этого:

print ser.read(ser.inWaiting())

Я вижу, вы используете ser.readline(), который должен ждать \n или до тех пор, пока не истечет время ожидания, но попробуйте ser.read(), он все равно должен распечатать то же самое (до тех пор, пока то, что вы получаете, имеет \n между ними)

Теперь вы говорите continuously transmitting как часто это бывает? Мне интересно, есть ли способ пропустить поступающие данные, если время чтения истекло.

person jramirez    schedule 30.10.2013