我有一个 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)
最佳答案
这通常是不可能的。内置串行端口无法检测已断开连接的伙伴。如果 GPS 接收器支持,您可以使用 CTX 线来检测断开连接的设备,但对于大多数设备来说,这通常不是有线的。这意味着您的 Raspberry Pi 将无法区分断开连接的设备和不发送任何内容的设备(因为它没有电源、损坏或其他原因)。
由于 GPS 接收器通常每秒至少发送一次消息,因此您可以添加一个超时,以便在等待更长时间时退出程序。正如您已经正确发现的那样,ser.readline()
正在阻塞。这意味着如果没有收到任何内容,则不会返回。您需要一个非阻塞变体,它不存在现成的。检查PySerial non-blocking read loop寻找可能的解决方案。
关于python - pyserial - 如果串行设备断开连接,我想收到错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70578531/