此脚本在延长一段时间后因串行timout异常而崩溃。在它出现以下错误之前,它已经达到了5000个循环:
Traceback (most recent call last):
File "C:\Users\3d Exposure\Desktop\venderFix.py", line 69, in <module>
A.setHigh(12)
File "C:\Python27\lib\arduino\arduino.py", line 30, in setHigh
self.__sendData('1')
File "C:\Python27\lib\arduino\arduino.py", line 58, in __sendData
self.serial.write(str(serial_data))
File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 270, in write
raise writeTimeoutError
SerialTimeoutException: Write timeout
为什么在完美工作这么长时间后会超时?我该如何阻止它呢?
import json
import urllib
from pprint import pprint
import time
from arduino import Arduino
##############################################################
#Change to suit the Mars Bars, currently at 0.2 of a second #
vendtime = 0.2 #
#
#Delay Time Between each Search (never below 15 seconds) #
delayTime = 15 #
#This is the search term for the URL. (%23 = #) #
searchTerm = '%23happy' #
#
A = Arduino('COM3') #
A.output([13]) #Output on pin 12 #
##############################################################
#to collect the first tweet without vending
countTweet = 0
#To test Twitter for consistancy
tweet= 0
noTweet= 0
#the infinate loop
while True:
#j contains the JSON we load from the URL
j =json.loads(urllib.urlopen('http://search.twitter.com/search.json?q='+searchTerm+'&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) #needed for debugging only
#find the text and the tweet id
if 'results' in j and j['results']:
text = j['results'][0]['text']
id = j['results'][0]['id']
#how many times the Json is complete
tweet+= 1
else:
#How many times the Json is incomplete (sometimes twitter malfunctions. About 0.1 in 100 are broken)
noTweet += 1
#print the text and id to the screen
pprint(text) #needed for debugging only
pprint(id) #needed for debugging only
#to get the existing tweet from before we power on, if the first ID has been stored already (count == 1)
if countTweet != 0: #if countTweet is not equal to 0 then it's not the first tweet
#pprint ("new loop") #needed for debugging only
#if lastID is not equal to ID
if lastID != id:
#Tell Arduino to Vend
#pin 12 HIGH
A.setHigh(13)
#Sleep for the time specified in vendtime
time.sleep(vendtime)
#pin 12 LOW
A.setLow(13)
#Display the tweet that triggered the vend
#pprint(text) #needed for debugging only
#pprint(id) #needed for debugging only
#Make lastID equal to ID so that next time we can compare it
lastID = id
#pprint ('lastID updated') #needed for debugging only
#if no new tweets, print
else: #needed for debugging only
pprint ('no new tweets') #needed for debugging only
#If it's the first loop, confirm by printing to the screen
else:
pprint("First loop complete")
pprint(text)
pprint(id)
lastID = id
pprint(lastID)
countTweet += 1 #Add 1 to countTweet
pprint ('Number of Tweets')
pprint (countTweet)
pprint('Working JSON')
pprint(tweet)
pprint('Broken JSON')
pprint(noTweet)
pprint('waiting')
time.sleep(delayTime)
为了与Arduino进行通信,我正在使用Python Arduino Prototyping API v2。它工作得很好,这是我用这个脚本编写的第一个也是唯一一个问题。 我想我需要自己设置一个超时,虽然我不是100%确定如何确保这不会有相同或类似的问题。