1

这是代码:

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 ,但随后它会结束代码。我想让它每次我阻塞一个传感器时,它都会打印相应的打印语句,无论我阻塞传感器多少次。我尝试添加许多变量来提供帮助,但它们没有用。如何使循环不断重复?

4

2 回答 2

0

您的最外层循环具有以下条件: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)
于 2020-08-09T18:56:36.883 回答
-1

'break' 语句结束 while 循环,所以尝试用 'pass' 替换它,如下所示:

elif y == 2:
   print('2')
   pass
于 2020-08-09T18:14:05.693 回答