python - pyserial - 如果串行设备断开连接,我想收到错误消息

标签 python raspberry-pi serial-port gps 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)

最佳答案

这通常是不可能的。内置串行端口无法检测已断开连接的伙伴。如果 GPS 接收器支持,您可以使用 CTX 线来检测断开连接的设备,但对于大多数设备来说,这通常不是有线的。这意味着您的 Raspberry Pi 将无法区分断开连接的设备和不发送任何内容的设备(因为它没有电源、损坏或其他原因)。

由于 GPS 接收器通常每秒至少发送一次消息,因此您可以添加一个超时,以便在等待更长时间时退出程序。正如您已经正确发现的那样,ser.readline() 正在阻塞。这意味着如果没有收到任何内容,则不会返回。您需要一个非阻塞变体,它不存在现成的。检查PySerial non-blocking read loop寻找可能的解决方案。

关于python - pyserial - 如果串行设备断开连接,我想收到错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70578531/

相关文章:

crash - 树莓派2崩溃: Internal error oops preempt smp arm

api - 可以通过程序访问传感器读数的家庭气象站?

serial-port - 从 Processing 到 Arduino 的串行写入发送损坏的数据

python - 如何使用 SAS 对存储队列的 Azure REST API 进行身份验证?

python - 对列表中的第一项进行优先排序(随机和概率分布)

linux - 检查字符串是否在命令答案中

c - 如何使用C语言从Arduino板读取数据到PC?

python - 如何正确使用内存传输进行单元测试

python - 名称错误 : global name 'execfile' is not defined trying to run an app on Google App Engine Launcher

python - 写 GPIO Raspberry PI 2 B+