Python 2.7 Pyserial readline()永远挂起程序,而不读取串行数据

Python 2.7 Pyserial readline()永远挂起程序,而不读取串行数据,python-2.7,pyserial,trace,rs485,Python 2.7,Pyserial,Trace,Rs485,调用pyserial.readline()函数时,我的程序挂起。我对程序进行了跟踪,底部循环不断重复 transport.py(47): self.sensor_data = self.serif.readline() --- modulename: serialposix, funcname: read serialposix.py(477): if not self.is_open: serialposix.py(479): read

调用pyserial.readline()函数时,我的程序挂起。我对程序进行了跟踪,底部循环不断重复

transport.py(47):             self.sensor_data = self.serif.readline()
 --- modulename: serialposix, funcname: read
serialposix.py(477):         if not self.is_open:
serialposix.py(479):         read = bytearray()
serialposix.py(480):         timeout = Timeout(self._timeout)
 --- modulename: serialutil, funcname: __init__
serialutil.py(125):         self.is_infinite = (duration is None)
serialutil.py(126):         self.is_non_blocking = (duration == 0)
serialutil.py(127):         self.duration = duration
serialutil.py(128):         if duration is not None:
serialutil.py(129):             self.target_time = self.TIME() + duration
serialposix.py(481):         while len(read) < size:
serialposix.py(482):             try:
serialposix.py(483):                 ready, _, _ = select.select([self.fd, self.pipe_abort_read_r], [], [], timeout.time_left())
 --- modulename: serialutil, funcname: time_left
serialutil.py(139):         if self.is_non_blocking:
serialutil.py(141):         elif self.is_infinite:
serialutil.py(144):             delta = self.target_time - self.TIME()
serialutil.py(145):             if delta > self.duration:
serialutil.py(150):                 return max(0, delta)
serialposix.py(484):                 if self.pipe_abort_read_r in ready:
serialposix.py(491):                 if not ready:
serialposix.py(493):                 buf = os.read(self.fd, size - len(read))
serialposix.py(496):                 if not buf:
serialposix.py(503):                 read.extend(buf)
serialposix.py(516):             if timeout.expired():
 --- modulename: serialutil, funcname: expired
serialutil.py(135):         return self.target_time is not None and self.time_left() <= 0
 --- modulename: serialutil, funcname: time_left
serialutil.py(139):         if self.is_non_blocking:
serialutil.py(141):         elif self.is_infinite:
serialutil.py(144):             delta = self.target_time - self.TIME()
serialutil.py(145):             if delta > self.duration:
serialutil.py(150):                 return max(0, delta)
serialposix.py(481):         while len(read) < size:
serialposix.py(518):         return bytes(read)
在启动read函数之前,我尝试添加函数
self.serif.reset\u input\u buffer()
,但这似乎让事情变得更糟

下面是
readline()
函数前面的函数副本

def rcv_data(self):
    """Receives data, cleans it and returns it to main()"""
    # CHECKS FOR DATA IN BUFFER
    serial_buffer = self.serif.inWaiting()
    if serial_buffer > 0:
        cnt = 0
        print("serial_buffer = %i" % serial_buffer)
        while self.serif.read().encode('hex') != '02':
            cnt += 1
            serial_buffer -= 1
        print("Eliminated %i peices of garbage" % (cnt))
        # Reads data from the buffer
        self.sensor_data = self.serif.readline()
我不明白为什么这段代码似乎卡在serialposix.py循环中。。如果有人能帮我,我将不胜感激

谢谢,如果我需要发送更多信息,请告诉我。

编辑

我以前为什么让它工作已经不再是个谜了。为我的设备和RS485电路上拉/下拉电阻器供电的电源不稳定。因此,我在我的SOF或EOF应该在的地方收到了噪音,所以程序一直在读。尽管如此,我仍然保留了下面的变通方法,因为它更清楚我在做什么(尽管更长…)

此外,我在下面的答案中添加了一个中断,以防在一定数量的读取周期中找不到SOF或EOF

编辑结束

不是一个特别的答案,而是一个解决办法。我将首先强调以下几点

  • readline()正在循环,因为它期望EOF为
    \n
    0x11
    ,十六进制)i和我的串行数据从未提供此值。我以前为什么让它工作是个谜
  • 我仍然不知道为什么在设定的超时之后,循环仍然没有停止
  • 从某种意义上说,我的解决方法是创建自己的readline()函数,并指定自己的EOF。我使用下面的代码来实现这一点

    def readline(self):
        SOF = '02'
        EOF = '03'
        # FIND START OF FRAME
        while serif.read().encode('hex') != SOF:
            continue
        # RECORD UNTIL END OF FRAME
        while True:
            temp = serif.read()
            if temp.encode('hex') == EOF:
                break
            else:
                sensor_data += temp
    
    我原来的函数现在看起来像这样

    def rcv_data(self):
        """Receives data cleans it and returns it to main()"""
        # CHECKS FOR DATA IN BUFFER
        if serif.inWaiting() > 0:
            readline()
        return sensor_data
    
    def rcv_data(self):
        """Receives data cleans it and returns it to main()"""
        # CHECKS FOR DATA IN BUFFER
        if serif.inWaiting() > 0:
            readline()
        return sensor_data