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 代码 运行你的电脑。
我正在尝试编写一个 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 代码 运行你的电脑。