在我的项目中,有一个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,那么如何检测是否没有连接?
答案 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