使用用户输入中断while循环(通过arduino和python 2.7控制neopixels)

Posted

技术标签:

【中文标题】使用用户输入中断while循环(通过arduino和python 2.7控制neopixels)【英文标题】:Interrupt while loop with user input (controlling neopixels via arduino and python 2.7) 【发布时间】:2016-07-17 15:12:07 【问题描述】:

我正在尝试通过 python 控制一些连接到 arduino 的新像素,但遇到了问题。出于本演示的目的,当 arduino 通过串行接收到“H”或“L”字符时,它们会亮起。

我原来的脚本是:

import serial
import time

ser = serial.Serial('/dev/ttyACM0', 9600)
#this is necessary because once it opens up the serial port arduino needs a second
time.sleep(3)

ser.write('H')

当我将它输入 python 控制台时它运行良好,但当我将它作为脚本运行时,灯在大约 3 秒后关闭。在进行了一些挖掘之后,看起来一种解决方法是将最后一位转换为 while 循环,这样串行连接就不会关闭:

import serial
import time

ser = serial.Serial('/dev/ttyACM0', 9600)
#this is necessary because once it opens up the serial port arduino needs a second
time.sleep(1)

while True:
    ser.write('H')
    time.sleep(3)

这让灯一直亮着,但产生了一个新问题。如果我想根据用户输入改变灯光,我可以做一次:

import serial
import time

ser = serial.Serial('/dev/ttyACM0', 9600)
#this is necessary because once it opens up the serial port arduino needs a second
time.sleep(1)

choice= raw_input("1 or 2?")


if choice == "1":

    while True:

        ser.write('H')
        time.sleep(3)


elif choice == "2":

    while True:

        ser.write('L')
        time.sleep(3)

然后脚本就卡在了子循环中。如何保持子循环运行(即保持灯亮)同时等待响应新的用户输入?

谢谢!

【问题讨论】:

这些可能会有所帮助:***.com/questions/32369495/…、***.com/questions/16828387/…、***.com/questions/31340/… 【参考方案1】:

这是我自己找到的解决方案。

import serial
import time

ser = serial.Serial('/dev/ttyACM0', 9600)

#this is necessary because once it opens up the serial port arduino needs a second
time.sleep(2)

#ask for the initial choice
choice= raw_input("1 or 2?")

#keeps the loop running forever
while True:

    #if the initial choice is 1, do this
    while choice == "1":

        #send the H signal to the arduino
        ser.write('H')

        #give the user a chance to modify the chioce variable
        #if the variable is changed to 2, the while condition will no longer
        #be true and this loop will end, giving it an oppotunity to go
        #do the second while condition.
        #pending the decision the light will stay on
        choice= raw_input("1 or 2?")


    while choice == "2":

        ser.write('L')

        choice= raw_input("1 or 2?")

【讨论】:

以上是关于使用用户输入中断while循环(通过arduino和python 2.7控制neopixels)的主要内容,如果未能解决你的问题,请参考以下文章

Empty While 循环 - Arduino

怎么把arduino接收数据清除掉

通过将 esc 作为用户的输入退出循环[重复]

arduino 用伺服电机中断

Ruby:如果while循环中断则放一条消息,如果while循环结束则放另一条消息

使用外部事件中断 while 循环