pySerial:什么是串行超时以及如何正确处理它?

时间:2018-07-24 17:21:13

标签: python serial-port putty pyserial

我正在通过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

0 个答案:

没有答案