проблем с серийно четене на 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

Започвам да получавам проблеми. Първият набор от стойности се отпечатва. От този момент нататък ser.readline() винаги изтича, давайки нулеви стойности!

Изход:

Value:
162

162

162

Value:



Value:

Защо серийният модул показва това поведение?

Първоначално машината, която използвах за четене на серийните стойности, беше платка Raspberry Pi, работеща с Raspian linux. Мислех, че проблемът може да се дължи на това, че RPi превключва USB в режим на заспиване с ниска мощност, когато се натъкне на период на неактивност. Но тествах същия код на лаптопа си, след което имаше същия проблем, което предполага, че може да е друг проблем.

Исках да създам система, която трябва да работи 24x7 и да чете серийни стойности при определени събития, така че това поведение не е приемливо.

Моля, хвърлете малко светлина по този въпрос.


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