这是我的代码:
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])
有时我会收到InvalidLiteral错误。
为了纠正这个问题,我必须再次运行代码:
x = ser.readline()
取消它,然后将18放回括号中并且它有效。我想将其纳入脚本中,如何做到这一点就是我所要求的。
答案 0 :(得分:0)
这样的东西?
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])
答案 1 :(得分: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])
如果尝试中的代码失败并带有指定的异常类型,则将执行相应的除块。注意:如果上面的代码成功,将不会执行。
最后,您还有 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])