我希望每次传感器检测到15厘米范围内的任何东西时,程序都能循环

2024-05-23 21:34:31 发布

您现在位置:Python中文网/ 问答频道 /正文

代码如下:

def check_ultra():
    global arduinoSerialData, y, i, x
    while True:
        if arduinoSerialData.inWaiting() > 1:
            myData = arduinoSerialData.readline()
            myData = str(myData)
            myData = myData.replace("b'", '')
            myData = myData.replace("\\r\\n'", str(0))
            myData = myData.replace("\\r00.000", str(0))
            myData = myData.replace("\\r00.000", str(0))
            if "c" in myData:
                myData = myData.replace("c", str(0))

                if y == 1:
                    y = 3
                    if float(myData) > 15:
                        x = 0
                    return y, x
                else:
                    if float(myData) < 15 and float(myData) > 1:
                        y = 1
                        x = 0
                        return y, x
            elif "a" in myData:
                myData = myData.replace("a", str(0))
                if y == 2:
                    y = 3
                    if float(myData) > 15:
                        x = 0
                    return y, x
                else:
                    if float(myData) < 15 and float(myData) > 1:
                        y = 2
                        x = 0
                        return y, x
            else:
                y = 0
                return y


set_servo1_angle(0)
set_servo2_angle(90)
go_out_count = 0
m1 = 0
count = 3
y = 0
i = 0
x = 0
while y == None or y == 0 or x == 1:
    # i = 0
    # y = None
    check_ultra()
    if y == 1 and x == 0:
        print("1")
        sleep(2)
    elif y == 2 and x == 0:
        print('2')
        sleep(2)

当前的功能是每次传感器1被阻止时打印1,但随后结束代码。我希望这样,每次我阻塞传感器时,它都会打印相应的打印语句,无论我阻塞传感器多少次。我尝试添加许多变量来帮助解决问题,但都不起作用。如何使循环不断重复


Tags: and代码inreturnifcheck传感器float
2条回答

最外层的循环具有以下条件:y==None or y==0 or x==1。其中的if语句只有在所有这些条件都为False时才会打印。这意味着循环保证在第一次打印输出时终止

如果希望循环无限期地继续,请忽略所有内容并继续。将回路替换为

while True:
    check_ultra()
    ...

在一个不相关的音符上,尽量避免使用全局。当您将它们设置在遗忘已久的位置时,它们可能会产生不可预测的副作用,通常会使代码更难维护。改为使用参数和返回值

例如:

def check_ultra(arduinoSerialData, x, y):
    while True:
        if arduinoSerialData.inWaiting() > 1:
            myData = arduinoSerialData.readline()
            myData = str(myData)
            myData = myData.replace("b'", '')
            myData = myData.replace("\\r\\n'", str(0))
            myData = myData.replace("\\r00.000", str(0))
            myData = myData.replace("\\r00.000", str(0))
            if "c" in myData:
                myData = float(myData.replace("c", "0"))

                if y == 1:
                    if myData > 15:
                        return 0, 3
                    return x, 3
                elif 1 < myData < 15:
                        return 0, 1
                return x, y
            elif "a" in myData:
                myData = float(myData.replace("a", "0"))
                if y == 2:
                    if myData > 15:
                    return 0, 3
                elif 1 < myData < 15:
                    return 0, 2
                return x, y
            else:
                return x, 0

你可以称之为

x, y = check_ultra(arduinoSerialData, x, y)

“break”语句结束while循环,因此请尝试将其替换为“pass”,如下所示:

elif y == 2:
   print('2')
   pass

相关问题 更多 >