serial.Serial.readline() 引发 SerialException,但同样的代码在一周前工作

Posted

技术标签:

【中文标题】serial.Serial.readline() 引发 SerialException,但同样的代码在一周前工作【英文标题】:serial.Serial.readline() raises SerialException, but the same code worked a week ago 【发布时间】:2015-10-05 18:07:50 【问题描述】:

我有一对应用程序通过串行端口发送文本(仅在一个方向)进行通信。他们已经工作了一段时间。上周,阅读端停止在我的机器上工作,并且每当我调用我的serial.Serial 对象的readline() 方法时都会引发SerialException相同的代码在另一台机器上运行良好!我能想到的唯一可能导致问题的是我在发生这种情况的前一天晚上安装了一堆系统更新(知道如何查看那个的历史?)。我使用的是 Ubuntu 和 Python 2.7.6(见下文),据我所知,我在两台机器上都安装了相同的 python 包。

我编写了两个小示例应用程序来尝试排除故障,但在阅读方面出现以下错误:

File "./reader.py", line 16, in <module>
  s = port.readline()
File "/usr/local/lib/python2.7/dist-packages/serial/serialposix.py", line 475, in read
  raise SerialException('device reports readiness to read but returned no data (device disconnected or multiple access on port?)')

我使用“真实”端口还是“虚拟”端口似乎并不重要,因此可以通过使用以下命令创建两个虚拟端口来重现这一点:

socat -d -d pty,raw,echo=0 pty,raw,echo=0

这是我为故障排除而创建的示例“writer.py”:

#!/usr/bin/env python
from __future__ import print_function
import serial

print( 'Opening port' )
port = serial.Serial( port='/dev/pts/5',  # Substitute the correct port here!
                      baudrate=115200,
                      bytesize=serial.EIGHTBITS,
                      parity=serial.PARITY_NONE,
                      stopbits=serial.STOPBITS_ONE,
                      timeout=0.25 )
while True:
    s = raw_input()
    if s:
        port.write( s + '\n' )

这很好用——我可以使用“串行端口终端”之类的应用程序读取通过端口传来的文本。

这是在另一台机器上可以找到但在我的机器上立即失败的示例“reader.py”:

#!/usr/bin/env python
from __future__ import print_function
import serial

print( 'Opening port' )
port = serial.Serial( port='/dev/pts/10',
                      baudrate=115200,
                      bytesize=serial.EIGHTBITS,
                      parity=serial.PARITY_NONE,
                      stopbits=serial.STOPBITS_ONE,
                      timeout=0.25 )
while True:
    s = port.readline()
    if s:
        print( s )

一旦我使用socat 命令创建虚拟端口并运行“reader.py”,我总是会立即得到异常。有什么想法可能在我的机器上发生了哪些变化而导致此故障?

系统信息:

~/temp$ uname -a
Linux alonghi-ubu 3.13.0-65-generic #105-Ubuntu SMP Mon Sep 21 18:50:58 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
~/temp$ python --version
Python 2.7.6

【问题讨论】:

串口!= 序列化。 好的...关于可能导致此问题的原因或如何排除故障或修复的任何有用的想法?我的 Ubuntu 系统发生了一些变化,但我不知道如何弄清楚。 【参考方案1】:

Ubuntu 14.04 3.13.0.65 内核中断了 python 串行通信。尝试将内核降级到 3.13.0-63,串行通信应该像以前一样工作

【讨论】:

谢谢! ...这是详细信息:bugs.launchpad.net/ubuntu/+source/linux-lts-trusty/+bug/1501345

以上是关于serial.Serial.readline() 引发 SerialException,但同样的代码在一周前工作的主要内容,如果未能解决你的问题,请参考以下文章