我正在通过USB端口从秤指示器传输串行数据,并打印最新的行以返回重量。
下面的代码可以正常工作,直到我的设备出现串行超时并且self.s.read(i)
返回空字符串,从而导致无限循环。这没什么问题,但由于某种原因,重新启动脚本时,设备仍处于超时状态,并且不传输任何重量数据。使用PuTTY进行流传输时的处理相同,在这两种情况下,我都必须重新启动计算机才能接收数据。为什么会发生这种情况,有没有适当的处理方法?
import serial
import threading
class ReadLine:
"""
pyserial object wrapper for reading line
source: https://github.com/pyserial/pyserial/issues/216
"""
def __init__(self, s):
self.buf = bytearray()
self.s = s
def readline(self):
i = self.buf.find(b"\n")
if i >= 0:
r = self.buf[:i + 1]
self.buf = self.buf[i + 1:]
return r
while True:
i = max(1, min(2048, self.s.in_waiting))
data = self.s.read(i)
i = data.find(b"\n")
if i >= 0:
r = self.buf + data[:i + 1]
self.buf[0:] = data[i + 1:]
return r
else:
self.buf.extend(data)
class SerialThread(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
self._is_running = True
def run(self):
s = serial.Serial('COM13')
scale = ReadLine(s)
while self._is_running:
try:
weight = scale.readline().decode() # reads most recent line
print(weight)
except UnicodeDecodeError:
pass
# close serial port
s.close()
def stop(self):
self._is_running = False