Raspberry Pi Zero W上的Python pySerial:检测断开连接的串行设备

Raspberry Pi Zero W上的Python pySerial:检测断开连接的串行设备,python,pyserial,raspberry-pi-zero,Python,Pyserial,Raspberry Pi Zero,在我的项目中,有一个Raspberry Pi Zero W,通过串行TX/RX线路(通过5-3.3V逻辑电平转换器)与Arduino Pro Micro相连。通电时,Arduino开始通过串口发送“Where you there”命令,直到Pi完成引导并启动了一个python程序,该程序在串口上侦听,并以“yes”回答。然后Arduino继续发送传感器数据的定期更新 由于某些尚未理解的原因,Arduino可以在Pi仍在运行时断开连接并重新启动。而且,由于某种原因,Python端的连接被切断,如果

在我的项目中,有一个Raspberry Pi Zero W,通过串行TX/RX线路(通过5-3.3V逻辑电平转换器)与Arduino Pro Micro相连。通电时,Arduino开始通过串口发送“Where you there”命令,直到Pi完成引导并启动了一个python程序,该程序在串口上侦听,并以“yes”回答。然后Arduino继续发送传感器数据的定期更新

由于某些尚未理解的原因,Arduino可以在Pi仍在运行时断开连接并重新启动。而且,由于某种原因,Python端的连接被切断,如果读取了
connection.in_waiting
,则不会引发异常

import serial
import time
ser = serial.Serial('/dev/serial0')
ser.baudrate = 9600
cmd = b''
while True:
  time.sleep(1)
  print(ser.is_open)
  while ser.in_waiting:
    ch = ser.read()
    if ch == b'\n':
      print('New command:', cmd)
      cmd = b''
      ser.write(b'OK\n')
      continue
    else:
      cmd = cmd + ch

我已经用这个简单的代码进行了测试,但是在我的测试中,如果我断开Arduino并将其连接回,
ser.是打开的
决不会是错误的,旧的连接在重新连接的Arduino上也可以正常工作。因此,不幸的是,当数据在断开连接后停止传输时,我无法准确地复制连接丢失场景。然而,为了进一步调查,我想添加一些监控代码,将串行断开事件记录在文件中。但是有办法吗?如果connection.is_open始终为true,即使没有连接Arduino,那么如何检测是否没有连接?

如果断开连接,端口将保持打开状态,因此示例代码将持续循环

import serial

def connect(port):
    return serial.Serial(port, baudrate=9600, timeout=1)

ser = connect('/dev/serial0')
buf = bytearray()
while True:
    i = buf.find(b'\n')
    if i >= 0:
        buf = buf[i + 1:]
        ser.write('OK\n')

    num_bytes = max(1, min(1024, ser.in_waiting))
    data = ser.read(num_bytes)
    if data:
        buf.extend(data)
    else:
        # no data to read aka disconnection has occurred
        ser = connect('/dev/serial0')
        if ser.isOpen():
            continue
        else:
            # could not reconnect
            break

你试过设置超时吗?在没有超时的情况下,
read()
将阻塞,直到读取请求的字节数(默认值为1)。@bromosapien
ser.read()
将在ser.in\u等待时立即跟随
。是否有任何原因导致
read()
在这种设置中被阻止?您必须使用此方法设置超时,因为要读取的最小字节数为1,并且没有超时
。read()
在等待接收未发送的字节时将挂起。为什么“无数据”表示已发生断开连接?另一端可能只是不发送任何东西。