11

動機

Python ライブラリPyserialの使用方法の学習を開始したいと思います。多くの人に利用されている本当に素晴らしいライブラリのようです。シリアル通信を自動化する必要がある今後のプロジェクトで使用したいと考えています。

環境

Ubuntu 15.04 を実行しています。Python 2.7 を使用しています。

仮想ポートの設定

現在、シリアル ポート経由で通信できるデバイスを持っていません。socatアプリケーションを使用して、9600 のボーレートで相互に接続された 2 つの仮想ポートを作成しています。

$ 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)

それは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 スクリプトをエラーなしで実行するにはどうすればよいですか?

4

2 に答える 2

18

この Q&A を完成させるための解決策は次のとおりです (Austin Philips のリンクを参照)。

#!/usr/bin/env python
import serial

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

詳細については、このPySerial Github の問題を参照してください。

于 2016-04-13T14:16:22.650 に答える
2

Sebastian が言及した問題によると、この問題は Pyserial のバージョン 3.1 で解決されています。

https://github.com/pyserial/pyserial/issues/59

zsquareplusc が 5 月 29 日にコメントしました

リリースされた 3.1 では、open() の制御行の設定エラーが無視されます (ただし、以降の呼び出しでは無視されます)。

pip、github、またはダウンロード ページから更新します: https://pypi.python.org/pypi/pyserial

于 2016-09-08T14:22:32.190 に答える