使用RPi GPIO在python中启动和停止应用程序?

时间:2015-11-09 23:55:09

标签: python raspberry-pi gpio

我正在使用这个python脚本:

import RPi.GPIO as GPIO
import subprocess
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(25, GPIO.OUT, initial=GPIO.LOW)

try:  
    while True:
        if GPIO.input(4):
            GPIO.output(25, 1)
            subprocess.call("/script/start.sh", shell=True)
        else:
            GPIO.output(25, 0)
            subprocess.call("/script/stop.sh", shell=True)
        sleep(0.2)

finally:
    GPIO.cleanup()

(没有子过程)当我按下按钮(GPIO 4)时,LED指示灯亮起,再次按下它并关闭它。效果很好。我目前正在使用2个脚本来启动和停止应用程序。在Python之外使用时,这些工作正常。当我尝试实现子进程时,事情开始变得不稳定。

脚本是:

#!/bin/bash
FILENAME=$(date +"%Y%m%d_%H%M")
rec -c 2 -b 24 -r 48000 -C 320.99 /mnt/usb/${FILENAME}.mp3
exit

#!/bin/bash
reco=`pidof -s rec`
kill $reco
exit

该过程将开始,并且它将继续运行,但是python脚本不会关闭它,除非我按下ctrl + c,无法使用GPIO开关。

我想要实现的目标是:

switch = high -> application starts
switch = low -> application stops

等待/循环,这样如果我按下开关,我就可以再次开始录制。

我怎样才能使其正常工作?

1 个答案:

答案 0 :(得分:1)

由于您正试图终止您在start.sh开始的流程。这就是我的建议:

import RPi.GPIO as GPIO
import signal
import subprocess
import os
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(25, GPIO.OUT, initial=GPIO.LOW)

rec_proc = None
try:  
    while True:
        if GPIO.input(4):
            GPIO.output(25, 1)
            if rec_proc is None:
                rec_proc = subprocess.Popen("/script/start.sh",
                           shell=True, preexec_fn=os.setsid)
        else:
            GPIO.output(25, 0)
            if rec_proc is not None:
                os.killpg(rec_proc.pid, signal.SIGTERM)
                rec_proc = None
        sleep(0.2)

finally:
    GPIO.cleanup()