1

我正在使用 Raspberry Pi 3B+ 根据来自键盘的输入来控制一些电机。我正在使用 pad4pi 库,并设置了一个定义来处理按键。我应该注意,我对 Python 很陌生。

我尝试在不同的位置放置返回和中断,但它们要么给出语法错误,要么像我再次按下按钮一样继续,(实际上就像没有返回一样。)

我尝试了多种方法,例如:

elif (key=="8"): #-y
    print('y-')
    GPIO.output(yp, False)
    GPIO.output(yn, True)
    time.sleep(.01)
    GPIO.output(yp, False)
    GPIO.output(yn, False)
    return

或者:

elif(key=="6"): #+x
    for t in range(5):
        print('x+')
        GPIO.output(xp, True)
        GPIO.output(xn, False)
    GPIO.output(xp, False)
    GPIO.output(xn, False)
    print('exit')
    return

但是 return 和 break 似乎在 if 函数之后返回,第一个中的 print 行和第二个中的 for 行。

我正在使用命令行进行反馈。对于第二个例子,我期待的是:

x+
x+
x+
x+
x+
exit

但我得到的是

x+
x+
x+
x+
x+
exit
x+
x+
x+
x+
...

编辑:这是调用函数的主要代码:

#main loop
while(True):
    keypad.registerKeyPressHandler(move)

这是它的定义方式:

def move(key):
  if (key=="2"): #+y
    print('y+')
...

之后它只是如上所示的 elifs 直到结束:

  else:
    return
  return

这基本上就是我认为的所有相关代码。如果您需要更多,请告诉我。编辑2:这是一些重现问题的代码:

import RPi.GPIO as GPIO
from pad4pi import rpi_gpio
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
import time
from time import sleep

#y control
yp = 24;
yn = 26;
GPIO.setup(yp, GPIO.OUT) #+y
GPIO.setup(yn, GPIO.OUT) #-y

#keypad inputs
KEYPAD = [
        ["1","2","3","A"],
        ["4","5","6","B"],
        ["7","8","9","C"],
        ["*","0","#","D"]
]

COL_PINS = [31, 33, 35, 37]
ROW_PINS = [32, 36, 38, 40]
factory = rpi_gpio.KeypadFactory()
factory.create_4_by_4_keypad
keypad = factory.create_keypad(keypad=KEYPAD, row_pins=ROW_PINS, col_pins=COL_PINS)

def move(key):
  if (key=="8"): #-y
    print('y-')
    GPIO.output(yp, False)
    GPIO.output(yn, True)
    time.sleep(.01)
    GPIO.output(yp, False)
    GPIO.output(yn, False)
    return
  else:
    return

#main loop
while(True):
    keypad.registerKeyPressHandler(move)
#cleanup:
keypad.cleanup()
GPIO.cleanup()

编辑 3:我收到的错误消息主要可以归结为我对 python 的缺乏经验。例如:

  if (key=="8"): #-y
    print('y-')
    GPIO.output(yp, False)
    GPIO.output(yn, True)
    time.sleep(.01)
    GPIO.output(yp, False)
    GPIO.output(yn, False)
    break
  else:
    return

给出:

> %Run recreate.py
Traceback (most recent call last):
  File "/home/pi/Desktop/python/recreate.py", line 36
    break
    ^
SyntaxError: 'break' outside loop

我尝试过的唯一没有给出该错误的位置是:

    elif(key=="6"): #+x
        for t in range(5):
            print('x+')
            GPIO.output(xp, True)
            GPIO.output(xn, False)
            break
        GPIO.output(xp, False)
        GPIO.output(xn, False)
        print('exit')
        return

返回:

x+
exit
x+
exit
x+
exit
x+
exit
x+
...

编辑:找到解决方法!移出 keypad.registerKeyPressHandler(move) 主循环。

4

1 回答 1

0

也许您不需要休息或返回?如果您的move()函数具有物理效果但对程序的状态没有影响,则可能不需要返回值。仅return在您想将某些内容传递回调用上下文时使用(例如,如果您的程序记录了位置)。但是 Python 可以处理只有“副作用”(并且return什么都没有)的函数。

您的if, elif, elif, else: 序列将在每次按键时执行一次,并且只会发生匹配的按键操作,然后下一次按键将再次调用 move()。

break切出循环并跳转到下一条可执行指令。

您可能一直在寻找 Python 关键字continueif/elif/elif ,它允许您将控制权发送回循环的头部,但我认为当一切都在块中时您不需要它。

我没有使用你正在使用的类,但我猜你应该将 Handler 函数的注册移到循环move之外While:你只是添加了一组关于当一个键被按下时要做什么的指令到keypad 对象,你只需要这样做一次。你的while(True):循环可以只检查一个条件来break- 检查一个传感器条件或一个特殊的键来停止执行。可能有一种更“事件驱动”的编码方式,但我不能就此提出建议。

于 2019-04-23T23:33:38.790 回答