如果出现错误,请运行新代码

2024-04-26 00:11:45 发布

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

这是我的密码:

for a in range (100):


        ser = serial.Serial(
            port = '/dev/ttyAMA0',
            baudrate = 38400,              #115200 is SMC-MRU, 9600
            parity = serial.PARITY_NONE,
            stopbits = serial.STOPBITS_ONE,
            bytesize = serial.EIGHTBITS,
            timeout = 1
        )
        counter = 0

        while 1:
            x = ser.readline(18)
            x2 = x.split(',')
            Yaxis = float(x2[1])
            Xaxis = float(x2[0])

偶尔我会犯错误。你知道吗

为了纠正这个问题,我必须再次运行代码:

x = ser.readline()

取消它,然后把18放回括号里,它就工作了。我想把它融入到剧本中,如何做到这一点是我的要求。你知道吗


Tags: indev密码forreadlineisportserial
2条回答

像这样的?你知道吗

for a in range (100):


    ser = serial.Serial(
        port = '/dev/ttyAMA0',
        baudrate = 38400,              #115200 is SMC-MRU, 9600
        parity = serial.PARITY_NONE,
        stopbits = serial.STOPBITS_ONE,
        bytesize = serial.EIGHTBITS,
        timeout = 1
    )
    counter = 0

    while 1:
        try:
            x = ser.readline(18)
        except ValueError:
            x = ser.readline()
        x2 = x.split(',')
        Yaxis = float(x2[1])
        Xaxis = float(x2[0])

正如IMCoins所说,try / except是您正在寻找的解决方案。你知道吗

首先,您可以捕获InvalidLiteral异常(它应该对应于ValueError类型,如here所述),然后进行相应的处理。这可以使用except指令作为回退:

while 1:
    try:
        x = ser.readline(18)
    except ValueError:
        x = ser.readline()
    x2 = x.split(',')
    Yaxis = float(x2[1])
    Xaxis = float(x2[0])

如果try中的代码以指定的Exception类型失败,则将执行相应的Exception块。注意:如果上述代码成功,则不会执行它。你知道吗

最后,还有finally指令,它总是在之后执行,而不管操作的成功与失败。正如您所说的,您必须不带参数地调用它,然后再试一次,您可能必须处理连接重置?我的想法是:

while 1:
    try:
        x = ser.readline(18)
    except ValueError:
        x = ser.readline()
        # handle the serial connection reset here if needed before retrying
        x = ser.readline(18)
    x2 = x.split(',')
    Yaxis = float(x2[1])
    Xaxis = float(x2[0])

相关问题 更多 >