SerialTimeoutException崩溃脚本

时间:2013-05-17 10:51:34

标签: python arduino pyserial

此脚本在延长一段时间后因串行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%确定如何确保这不会有相同或类似的问题。

0 个答案:

没有答案