Raspi python脚本不断崩溃

时间:2017-04-05 09:24:21

标签: python while-loop crash

我拥有一台连接到树莓的3D打印机。为了控制(如通过继电器关闭和关闭)远程打印机,我制作了一个小的python脚本。

控制它的一种可能性是使用似乎正常工作的Telegram Bot(telepot)。 打开和关闭打印机的另一种方法是硬件开关。出于安全原因,我希望只有按下开关3秒钟才能关闭打印机。

问题是,脚本有时会崩溃(大多数是在很长的正常运行时间之后)。 我认为它是我最后的循环,但我不明白为什么它只会在不同的时间后崩溃以及如何改进它。 那是迄今为止的代码:

#!/usr/bin/python
import time
import subprocess
import os
import datetime
import telepot
import urllib
import RPi.GPIO as GPIO

chat_id_auth = XXXXXXXXXXX


# Warnungen ausschalten
GPIO.setwarnings(False)
# Pin Nummern verwenden
GPIO.setmode(GPIO.BOARD)
# Pin 11 als Input
GPIO.setup(29, GPIO.IN)
GPIO.setup(11, GPIO.OUT)

GPIO.output(11, 0) #on

def handle(msg):
    chat_id = msg['chat']['id']
    command = msg['text']

    print 'Got command: %s' % command    
    if chat_id == chat_id_auth:    
        if command == '/status':
            bot.sendMessage(chat_id, 'online')
        elif command == '/picture':
            bashCommand = 'wget --output-document snapshot.jpg http://127.0.0.1:8080/?action=snapshot'
            subprocess.check_output(bashCommand, shell=True)
            print ('downloaded photo')
            bot.sendPhoto(chat_id, open('snapshot.jpg','rb'), caption='Printer Status')
            print ('sent photo')
            bashCommand = 'rm snapshot.jpg'
            subprocess.check_output(bashCommand, shell=True)
            print ('removed photo')
        elif command == '/ip':
            bashCommand = 'ifconfig eth0 | grep \'inet addr:\' | cut -d: -f2 | awk \'{ print $1}\''
            output = subprocess.check_output(bashCommand, shell=True)
            bot.sendMessage(chat_id, output)
            print(output)
        elif command == '/on':
            #bashCommand = 'echo \'0\' > /sys/class/gpio/gpio17/value'
            #output = subprocess.check_output(bashCommand, shell=True)
            GPIO.output(11, 0) #on
            bot.sendMessage(chat_id, 'Drucker wird eingeschaltet..')
            #print(output)
        elif command == '/off':
            #bashCommand = 'echo \'1\' > /sys/class/gpio/gpio17/value'
            #output = subprocess.check_output(bashCommand, shell=True)
            GPIO.output(11, 1) #off
            bot.sendMessage(chat_id, 'Drucker wird ausgeschaltet..')
            #print(output)    
    else:
        bot.sendMessage(chat_id, 'You are not authorized.')



bot = telepot.Bot('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
bot.message_loop(handle)
print 'I am listening ...'


global n
n=0
while True:
    if GPIO.input(29):
        if  GPIO.input(11) == 0:
            if n >= 300: #Taster 3s halten zum Ausschalten
                GPIO.output(11, 1) #off
                n=0
                time.sleep(2)
        elif GPIO.input(11) == 1:
            GPIO.output(11, 0) #on
            n=0
            time.sleep(2)
        time.sleep(0.01)
        n+=1
    else:
        n=0
    print n 

GPIO.cleanup()

1 个答案:

答案 0 :(得分:0)

我看不出崩溃的明确原因,但最后的while循环似乎非常繁忙,等待什么也没做(没有按下按钮)。根据我的理解,然后打印0和循环没有任何延迟,因此它将尽可能快地打印零并尽可能地保持Raspi忙。也许负载是您遇到任何崩溃的间接原因(但这只是疯狂的猜测)。

无论如何,我建议改进那个大规模忙碌的等待。即使它没有解决崩溃,它也会改善您的代码。要实现这一点,只需在time.sleep(0.1)分支中添加else:,每秒最多循环十次(并不像CPU那样快)。

无论如何你应该调试情况。找出崩溃的原因。

  • 将输出记录到某个文件中。 (./script.py >& script.log
  • try / except您的例外和打印调试内容,以防您抓到一些。
  • 无论是谁启动它都应该监视其退出代码并进行记录。
    • 收到的Unix信号导致退出代码为128 +信号编号。
    • 在命令行上键入kill -l以查看所有信号及其编号的列表。