2013-04-04 5 views
1

Этот скрипт Python отлично работает в течение нескольких дней, а затем сбой, вы знаете, почему это произойдет или как его отладить? Он подключен к Arduino, который посылает высокочастотный контакт, когда он получает «1» через последовательный порт. Сценарий запускается, когда компьютер загружается и запускается вечно. Однако, если это произошло, у меня нет способа перезапустить скрипт, поскольку компьютер находится в удаленном месте.Зачем этот скрипт Python рушится?

import json 
import urllib 
from pprint import pprint 
import time 
import serial 

#to collect the first tweet without telling the arduino 
countTweet = 0 
tweet= 0 
noTweet= 0 

#the infinate loop 
while True: 
    #the connection to the arduino 
    ser = serial.Serial('COM3',9600) 
    #not connected to arduino before connection is made 
    connected = False 

    #loop until the arduino is connected 
    while not connected: 
     serin = ser.read() 
     connected = True 
    #debug arduino connection 
    if connected == True: 
     pprint('connected to arduino') 

    #j contains the JSON 
    j =json.loads(urllib.urlopen('http://search.twitter.com/search.json?q=%23workrestandplayground&result_type=recent&rpp=1&filter:retweets').read()) 

    #Debug JSON from twitter (for faults on the Twitter end or possible GET limit id below 15 seconds per request) 
    pprint(j) 

    #find the text and the tweet id 
    if j['results']: 
     text = j['results'][0]['text'] 
     id = j['results'][0]['id'] 
     #how many times the Json is correct 
     tweet+= 1 
    else: 
     #How many times the Json is false 
     noTweet += 1 

    #print the text and id to the screen 
# pprint(text) 
# pprint(id) 

    #to isolate the first loop, if the first ID has been stored already (count == 1) 
    if countTweet != 0: 
     pprint ("new loop") 
     #if lastID is not equal to ID 
     if lastID != id: 
     #Tell Arduino to Vend 
      ser.write('1') 
      #ser.write('0') 
      #loop until the arduino tells us it is done vending 
      while ser.read() == '1': 
       ser.read() 
      #Debug 
      pprint(text) 
      pprint(id) 
      #Make lastID equal to ID 
      lastID = id 
      pprint ('lastID updated') 
     #if no new tweets, print  
     else: 
      pprint ('no new tweets') 
    #If it's the first loop, confirm by printing to the screen 
    else: 
     pprint("First loop complete") 
     lastID = id 
     pprint(lastID) 


    #make count not equal to 0 after first loop 
    countTweet += 1 

    pprint ('closing arduino connection') 
    ser.close() 

    #wait 
    pprint('waiting 15 seconds') 
    pprint ('Number of Tweets') 
    pprint (countTweet) 
    pprint('Working JSON') 
    pprint(tweet) 
    pprint('Broken JSON') 
    pprint(noTweet) 
    time.sleep(15) 

Сообщения об ошибке следующего

Traceback (most recent call last): 
    File "C:\Users\3d Exposure\Desktop\M001.py", line 19, in <module> 
    ser = serial.Serial('COM3',9600) 
    File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 31, in __init__ 
    SerialBase.__init__(self, *args, **kwargs) 
    File "C:\Python27\lib\site-packages\serial\serialutil.py", line 261, in __init__ 
    self.open() 
    File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 71, in open 
    self._reconfigurePort() 
    File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 186, in _reconfigurePort 
    raise ValueError("Cannot configure port, some setting was wrong. Original message: %s" % ctypes.WinError()) 
ValueError: Cannot configure port, some setting was wrong. Original message: [Error 31] A device attached to the system is not functioning. 

Я считаю, что это проблема с этим утверждением

while ser.read() == '1': 
    ser.read() 

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

while ser.read() == '0': 
    break 

работа?

+5

ли вы получите сообщение об ошибке и/или трассировку стека? – RichieHindle

+3

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

ответ

5

У меня нет обработки ошибок. Итак, все, что пойдет не так, приведет к выходу сценария. Например, если соединение с Интернетом или Twitter отключится, вызов urlopen завершится неудачно, и весь скрипт перестанет работать. Это наиболее очевидное место для добавления обработки ошибок, но что произойдет, если вы отключите последовательный порт?

Добавить обработку ошибок для обработки потенциальных ошибок, иначе Python будет обрабатывать ошибки, и вам не понравится, как это делается.

1

Вы можете защитить urllib.urlopen вызов с try...except:

try: 
    response = urllib.urlopen('http://search.twitter.com/search.json?q=%23workrestandplayground&result_type=recent&rpp=1&filter:retweets') 
except IOError: 
    # This includes urllib.ContentTooShortError 
    time.sleep(60) 
    continue 
j =json.loads(response.read()) 
Смежные вопросы