1

这个 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

工作?

4

2 回答 2

5

我没有看到任何错误处理。因此,出现任何问题都会导致脚本退出。例如,如果 Internet 连接或 Twitter 出现故障,urlopen呼叫将失败,整个脚本将停止工作。这是添加错误处理最明显的地方,但是如果断开串行端口会发生什么?

添加错误处理来处理潜在的错误,否则 Python 会处理错误,而你不会喜欢它这样做的方式。

于 2013-04-04T18:22:00.723 回答
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())
于 2013-04-04T18:26:10.740 回答