这个Python脚本可以运行好几天然后崩溃,你知道为什么会发生这种情况或如何调试它吗? 它连接到一个Arduino,当它通过串行接收'1'时发送一个高电平引脚。 该脚本在计算机启动时启动,应该永久运行。如果它确实崩溃了,我没有办法重新启动脚本,因为计算机在远程位置。
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
工作?
答案 0 :(得分:5)
我没有看到任何错误处理。因此,任何出错的地方都会导致脚本退出。例如,如果Internet连接或Twitter关闭,urlopen
调用将失败,整个脚本将停止工作。这是添加错误处理最明显的地方,但如果断开串口会发生什么?
添加错误处理以处理潜在错误,否则Python将处理错误,您不会喜欢它的方式。
答案 1 :(得分: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())