2

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

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

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 始终为真,即使没有连接 Arduino,那么如何检测是否没有连接?

4

1 回答 1

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
于 2019-09-11T13:16:51.117 回答