2016-01-16 128 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