我有一对应用程序通过串行端口发送文本(仅在一个方向上)进行通信。他们一直在努力工作。上周,阅读方停止在我的机器上工作,并且每当我调用SerialException
对象的readline()
方法时,都会引发serial.Serial
。 相同的代码在另一台机器上工作正常!我能想到的唯一可能导致问题的是我在发生这一天的前一晚安装了一堆系统更新(不知道怎么看那个的历史?)。我使用的是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?)')
我是否使用&#34;真实&#34;似乎并不重要。端口或虚拟&#34;端口,因此可以通过使用以下命令创建两个虚拟端口来重现:
socat -d -d pty,raw,echo=0 pty,raw,echo=0
以下是示例&#34; writer.py&#34;我为故障排除而创建的:
#!/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' )
这很好用 - 我可以使用像#34;串口终端&#34;这样的应用来读取通过端口传入的文本。或者这样。
以下是示例&#34; reader.py&#34;它可以在另一台机器上找到但在我的机器上立即失败:
#!/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
命令创建虚拟端口并运行&#34; reader.py&#34;后,我总是立即获得异常。我的机器上可能发生什么变化的想法会导致这种失败?
系统信息:
~/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
答案 0 :(得分:1)
Ubuntu 14.04 3.13.0.65内核破坏了python串口通信。尝试将内核降级到3.13.0-63,串行通信应该像以前一样工作