Pyserial与虚拟串口不兼容

12

动机

我想开始学习如何使用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脚本
我使用pip安装pyserial。
$ sudo pip install pyserial

然后我写了一个小的serialtest.py

#!/usr/bin/env python
import serial

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

That is the entirety of 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

这是怎么回事?

调试不成功的尝试

这个人说他在使用Python 2.6时成功了。但我无法让Pyserial在2.6上运行。

这个人遇到了波特率问题。我用命令$stty -F /dev/pts/2检查了我的波特率,确认它确实是9600。

这个人也声称有波特率问题,并将其归因于他的内核。那是在2012年,所以我认为这已经不相关了。

我的问题

如何使我的serialtest.py脚本运行无误?


请参见 https://github.com/pyserial/pyserial/issues/59。 - Austin Phillips
@AustinPhillips 你真是个酷酷的家伙。我对串行通信、RS-232和readytosend/cleartosend并不了解,所以你在Pyserial维基上提出的问题在概念上对我来说并不清楚。然而,我盲目地倒置了serialposix.py的310和312行的逻辑,并再次尝试了我的脚本。 它起作用了! 我现在可以使用Pyserial读写我的虚拟端口。尽管你对你的修复措施似乎不是100%有信心,但我愿意接受它。谢谢你的时间! - Spencer B Liberto
2个回答

18
为了让这个问答完整,这是一个解决方案(来自Austin Philips提供的链接):
#!/usr/bin/env python
import serial

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

更多解释请参见PySerial Github问题


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接