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

时间:2019-09-07 10:07:37

标签: python pyserial raspberry-pi-zero

在我的项目中,有一个Raspberry Pi Zero W,通过串行TX / RX线(通过5-3.3V逻辑电平转换器)与Arduino Pro Micro链接。上电时,Arduino开始通过串行发送“您在那里”命令,直到Pi完成启动并启动侦听串行端口的python程序,然后回复“是”。然后Arduino继续发送传感器数据的定期更新。

由于尚未理解的原因,在Pi仍在运行时,Arduino可以断开连接并重新启动。而且,由于某种原因,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.is_open永远不会是False,并且旧的连接也可以正常工作Arduino的。因此,不幸的是,当数据在断开连接后停止时,我无法完全复制丢失连接的情况。但是,为了进行进一步调查,我想添加一些监视代码,以将串行断开事件记录在文件中。但是有办法吗?如果connection.is_open始终为true,即使没有连接Arduino,那么如何检测是否没有连接?

1 个答案:

答案 0 :(得分:0)

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

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