Python 需要通过userinput(GPIO.input)结束子流程的循环
我需要在一个python程序中对一个raspberry pi执行一个bash命令,该命令启动一个记录,如果声音高于某个频率,并且在8秒后结束,或者如果没有声音,则开始记录。录制完成后,它会自动启动并等待录制新的声音。每条记录都标有时间。这就是我在这里引用的代码:Python 需要通过userinput(GPIO.input)结束子流程的循环,python,bash,subprocess,record,raspberry-pi2,Python,Bash,Subprocess,Record,Raspberry Pi2,我需要在一个python程序中对一个raspberry pi执行一个bash命令,该命令启动一个记录,如果声音高于某个频率,并且在8秒后结束,或者如果没有声音,则开始记录。录制完成后,它会自动启动并等待录制新的声音。每条记录都标有时间。这就是我在这里引用的代码: while GPIO.input(26) == False: timestamp = datetime.datetime.now().strftime('%Y%m%d%H%M%S') process = subproce
while GPIO.input(26) == False:
timestamp = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
process = subprocess.Popen ("rec -c 2 -r 192000 --buffer 50000 -b 32" + filepath + timestamp + ".wav sinc 0.1k silence 1 0.1 0.8% 1 0.4 0.8% vol 6 trim 0 8", shell = True)
process.communicate()
如您所见,要完成循环,程序将等待GPIO输入信号(按钮)。我有一个额外的代码,它查找子进程的名称并终止它
但我的问题是:当循环运行时,它只在一个记录完成和一个新记录开始之间的毫秒内“寻找”输入。如果我在记录期间按下按钮,循环将在记录之后继续。只有在中间按下按钮,循环才会断开
起初,我认为while循环可能是一个不好的选择……但是如果我没有错的话,问题似乎是正在运行的子流程
所以这里是我的问题:我如何才能完成这个记录循环,但可以通过GPIO的用户输入在运行记录时停止/终止(ctrl+c不是一个可行的选项)
非常感谢问题在于
while
循环每次仅通过循环检查一次条件call等待rec
命令完成,因此您完全正确-按钮只检查一次,就在rec
之后和时间戳=…
之前
解决方案是在单独的线程中观察按钮,与rec
并行运行。建议使用RPi.GPIO库中的按钮。请尝试以下操作:
should_exit = False
def my_callback(channel):
if GPIO.input(26):
should_exit = True
GPIO.add_event_detect(26, GPIO.RISING, callback=my_callback, bouncetime=300)
while not should_exit:
timestamp = ...
按下按钮时,
my\u callback
例程应运行,并设置should\u exit
标志。一旦rec
完成,while
将检查should\u exit
并终止。(警告-未测试!)非常感谢,我会尝试它-我的问题是,我也想取消运行记录-但我猜-通过这种方式我可以执行kill脚本OK,我尝试过它-事件检测有时可以工作-但它似乎非常不可靠Leglad它总比没有好!恐怕我没有RPi.GPIO的个人经验。推送吗按钮具有正确的上拉或下拉功能?所有连接都牢固吗?间歇性操作可能是硬件问题。此外,请尝试一个不运行rec
但只打印调试消息的循环,看看按钮是否被正确检测到。我将尝试它,谢谢。直到知道有时它不起作用,否则它将连续工作2次然后停止检测某些东西,有一段时间它工作得很好,时间更长,但也停止在输入中检测-可能是正常的GPIO.in和检测调用之间的干扰,而GPIO.input(26)=False: