2016-01-16 75 views
7

动机Pyserial不与虚拟端口

我要开始leraning如何使用Python库Pyserial发挥出色。这似乎是一个非常好的图书馆,适用于很多人。我想用它来实现即将到来的项目,在这个项目中我必须自动化串行通信。

环境

我运行Ubuntu 15.04。我正在使用Python 2.7。

设置虚拟端口

我目前还没有,我可以通过串口通信的设备。我使用的socat应用程序来创建连接到彼此的9600

$ socat -d -d pty,raw,echo=0,b9600 pty,raw,echo=0,b9600 
2016/01/16 12:57:51 socat[18255] N PTY is /dev/pts/2 
2016/01/16 12:57:51 socat[18255] N PTY is /dev/pts/4 
2016/01/16 12:57:51 socat[18255] N starting data transfer loop with FDs [5,5] and [7,7] 
$ echo "hello" > /dev/pts/2 
$ cat /dev/pts/4 
hello 

大的波特率两个虚拟端口!这似乎是港口的工作!

一个简单的脚本pyserial

我安装pyserial使用PIP

$ sudo pip install pyserial 

然后我写了一个小serialtest.py

#!/usr/bin/env python 
import serial 

ser = serial.Serial('/dev/pts/2', 9600) 

也就是说serialtest.py

的全部

运行脚本,并遇到一个错误

$ python serialtest.py 
Traceback (most recent call last): 
    File "serialtest.py", line 4, in <module> 
    ser = serial.Serial('/dev/pts/2') 
    File "/home/sbl/.local/lib/python2.7/site-packages/serial/serialutil.py", line 180, in __init__ 
    self.open() 
    File "/home/sbl/.local/lib/python2.7/site-packages/serial/serialposix.py", line 311, in open 
    self._update_dtr_state() 
    File "/home/sbl/.local/lib/python2.7/site-packages/serial/serialposix.py", line 605, in _update_dtr_state 
    fcntl.ioctl(self.fd, TIOCMBIS, TIOCM_DTR_str) 
IOError: [Errno 22] Invalid argument 

什么与怎么了?在调试

This guy

尝试不成功,他说,使用Python 2.6时取得了成功。我无法让Pyserial与2.6一起工作。

This guy有问题是波特率。我使用命令$stty -F /dev/pts/2再次检查我的波特率,并确认它实际上是9600的波特率。

This guy也声称有波特率问题并将其归因于其内核。那是在2012年,所以我不认为它是相关的了。

我的问题

我怎样才能让我的serialtest.py脚本运行没有错误?

+0

见https://github.com/pyserial/pyserial/issues/59。 –

+0

@AustinPhillips你是一个很酷的家伙。我不太了解串行通信和RS-232,并且已经准备好了,因此你在Pyserial wiki上提出的问题在我看来并不清晰。但是,我盲目地颠倒了serialposix.py的第310行和第312行的逻辑,并再次尝试了我的脚本。有效!我现在可以使用Pyserial读取和写入我的虚拟端口。尽管看起来你对解决方案并不是100%自信,但我愿意与它一起运行。谢谢你的时间! –

回答

10

为了使这个问答&一个完整的,这是一个解决方案(如在奥斯汀飞利浦的链接找到):

#!/usr/bin/env python 
import serial 

ser = serial.Serial('/dev/pts/2', 9600, rtscts=True,dsrdtr=True) 

更多解释见这PySerial Github issue