pyserial - 如果串行设备断开连接,我希望得到一个错误提示。
pyserial - 如果串行设备断开连接,我希望得到一个错误提示。
我已将GPS模块连接到我的Raspberry Pi上,如果在任何时候设备断开连接,我希望程序能够结束。如果我现在断开连接,程序会一直停止。有什么方法可以解决这个问题吗?
这是我的代码:
import serial import time import string import pynmea2 while True: port="/dev/ttyAMA0" ser=serial.Serial(port, baudrate=9600, timeout=1) dataout = pynmea2.NMEAStreamReader() newdata=ser.readline() if newdata[0:6] == "$GPRMC": newmsg=pynmea2.parse(newdata) lat=newmsg.latitude lng=newmsg.longitude gps = str(lat) + ", " + str(lng) print(gps)
admin 更改状态以发布 2023年5月21日
你可以使用Python的try-except语句来捕捉错误,并使用quit()退出程序。此外,循环中的ser初始化是否有意义?如果不是,您可能想将其放在循环外,以避免不必要的重新初始化。
所以代码会看起来像这样:
import serial import time import string import pynmea2 port = "/dev/ttyAMA0" ser = serial.Serial(port, baudrate=9600, timeout=1) dataout = pynmea2.NMEAStreamReader() while True: if ser.in_waiting: try: newdata = ser.readline() except: print("Error!") quit() if newdata[0:6] == "$GPRMC": newmsg = pynmea2.parse(newdata) lat = newmsg.latitude lng = newmsg.longitude gps = str(lat) + ", " + str(lng) print(gps)
您也可以在except语句中指定错误类型。供参考:https://docs.python.org/3/tutorial/errors.html
通常情况下这不可能实现。内置串口没有任何捕捉断开连接伙伴的方式。如果GPS接收器支持的话,您可以使用CTX线来检测已经断开的设备,但这通常不适用于大多数设备的线路布线。这意味着你的树莓派无法区分一个已经断开连接的设备和一个设备不发送任何信息(因为没有电源,坏了或者其他原因)。
由于GPS接收器通常每秒钟至少发送一条消息,您可以添加超时来在等待时间过长时退出程序。就像您已经正确发现的那样,ser.readline()
是阻塞的。这意味着如果什么也没有接收到,它将不会返回。您需要使用非阻塞的变体,这个功能在开箱即用的包中不存在。请查看PySerial非阻塞读取循环可能是一个解决方案。