python 打开的程序未关闭的问题

Problems with programs not closing that were opened by python

我正在尝试编写一个 python 代码,它获取 Arduino 的输出并在按下按钮时启动程序。当我按下 Arduino 上的按钮时,它会启动所需的程序,但当我关闭打开的程序时,它会再次自行打开,并且会重复很多次。直到我猜,没有更多的“按钮高”驱动。这是我的代码:


import time
import serial
import subprocess

chonk = serial.Serial('COM5', 9600, timeout=1)

while True:
    dataUwU = chonk.readline()
    print(dataUwU)

    if b'1H' in dataUwU:
        subprocess.call("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe")
        while b'1H' in dataUwU:
            dataUwU = chonk.readline()
            print(dataUwU)
            
    if b'2H' in dataUwU:
        subprocess.call(r"C:\Users\lastname\AppData\Local\Programs\Microsoft VS Code\Code.exe")
        while b'2H' in dataUwU:
            dataUwU = chonk.readline()
            pass



变量dataUwU中保存的是按钮的状态。我不明白这种奇怪的行为!谁能帮忙?提前致谢!!!

您应该关心 去抖动 按钮输入,因为大多数机械按钮(或开关)在您按下或按下它们时都会产生静电噪音。即使按钮状态看似高低切换很明显,实际波形也显示出短时间内的反弹或波动,如下图。

所以,我想即使你按下按钮一次,Arduino 也会多次传输“按钮被按下”数据包,从而触发子进程调用多次打开程序。第二次和后续调用可能会等到第一个打开的程序关闭。

如果正确,您的问题可以通过移除或处理退回来解决。要消除弹跳,应在按钮上并联一个电容器以滤除高频噪声。如果您不想要类似的硬件,您可以修改 Arduino 草图以忽略反弹并找出真正的开关状态转换。请参考官方debounce example.

编辑)我不确定它是否有效,但试试这个 python 代码而不是修改 Arduino 草图。您可以调整DEBOUNCE_DELAY。延迟越短,响应越快,但越容易反弹。

import time
import serial
import subprocess

chonk = serial.Serial('COM5', 9600, timeout=1)
t_last_changed = time.time()
last_state = None
button_state = None
DEBOUNCE_DELAY = 0.5

while True:
    dataUwU = chonk.readline()
    print(dataUwU)

    if dataUwU != last_state:
        t_last_changed = time.time()

    if(time.time() - t_last_changed > DEBOUNCE_DELAY):
        if dataUwU != button_state:
            button_state = dataUwU

            if b'1H' in dataUwU:
                subprocess.call("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe")
                while b'1H' in dataUwU:
                    dataUwU = chonk.readline()
                    print(dataUwU)

                    
            if b'2H' in dataUwU:
                subprocess.call(r"C:\Users\lastname\AppData\Local\Programs\Microsoft VS Code\Code.exe")
                while b'2H' in dataUwU:
                    dataUwU = chonk.readline()
                    pass
    last_state = dataUwU

Edit2) 即使 python 代码有效,我还是建议您在 Arduino 上处理反弹,因为 Arduino 比 Python 代码 运行你的电脑。