Этот скрипт 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
работа?
ли вы получите сообщение об ошибке и/или трассировку стека? – RichieHindle
Похоже, вы должны реализовать некоторые протоколирования, особенно если он будет работать в течение длительного времени. – BenDundee