【问题标题】:Need to end a loop of a subprocess through userinput (GPIO.input)需要通过用户输入(GPIO.input)结束一个子进程的循环
【发布时间】:2016-01-12 14:15:30
【问题描述】:

我需要在树莓派上的 python 程序中执行一个 bash 命令,它开始一个记录,如果它们是高于某个频率的声音并在 8 秒后结束或者如果有静音,它就真正开始记录。录制完成后,它会自行启动并等待录制新声音。每条记录都标有时间。这就是我在这里引用的代码:

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-loop 可能是一个糟糕的选择……但如果我没记错的话,问题似乎是正在运行的子进程。

所以这是我的问题:我怎样才能完成这个记录循环,但可以通过 GPIO 的用户输入在运行记录期间停止/终止。 (ctrl+c 不是一个可行的选择)

非常感谢

【问题讨论】:

  • while GPIO.input(26) == False: recording = False; while GPIO.input(26) == False and not recording: recording = True; start_recording(); # recording finishes... recording = False;

标签: python bash subprocess record raspberry-pi2


【解决方案1】:

问题是while 循环每次通过循环只检查一次条件。 process.communicate() 调用等待 rec 命令完成,所以你是绝对正确的 - 该按钮只检查一次,就在 rec 之后和 timestamp = ... 之前。

解决方案是在一个单独的线程中观察按钮,与rec 并行运行。 This answer 建议使用 RPi.GPIO 库中的 event detection。试试这样的:

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_callback 例程应在按下按钮时运行,并设置should_exit 标志。一旦rec 完成,while 将检查should_exit 并终止。 (注意 - 未经测试!)

【讨论】:

  • 非常感谢,我会试试的-我的问题是,我也想取消运行记录-但我猜-这样我可以执行kill-script
  • 好的,我试过了 - 事件检测工作 - 有时 - 但它似乎很不可靠
  • 很高兴有总比没有好!恐怕我对 RPi.GPIO 没有亲身经历。按钮是否有适当的上拉或下拉?所有的连接都牢固吗?间歇性操作可能是硬件问题。另外,尝试一个不运行 rec 的循环,而只是打印一条调试消息,看看是否正确检测到按钮。
  • 我会试试的,谢谢。直到知道有时它什么也不工作,比它连续工作 2 次然后停止然后检测到某些东西,并且有时间它工作得很好很长时间,但也停止检测输入 - 也许这是正常 GPIO 之间的干扰。 in 和检测调用
猜你喜欢
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 2021-12-31
相关资源
最近更新 更多