2013-04-04 74 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 2013-04-04 18:04:04

+3

看起来你应该实现一些日志记录,特别是如果它要运行很长时间。 – BenDundee 2013-04-04 18:25:59

回答

5

我看不到任何错误处理。所以,任何出错都会导致脚本退出。例如,如果Internet连接或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())