Linux では、次のように fdpexpect モジュールを使用してシリアル ポートとやり取りします。
fd = os.open(TTY, os.O_NONBLOCK|os.O_RDWR|os.O_NOCTTY)
child = fdpexpect.fdspawn(fd)
Windowsでは、上記をどのように実装しますか?
pyserialは、シリアル ポート用のプラットフォームに依存しないインターフェイスを提供します。
今週末、Windows 7でこれが機能するようになりました。これが私が行った方法です。
まず、fdpexpect モジュールは、Python 2.7 でシリアル ポートと「チャット」する唯一の方法のようです。最新の Python pexpect モジュールのドキュメントには、整数 (int) ファイル記述子 (fdpexpect など) を使用できると書かれていますが、私の Ubuntu 12.10 インストールでは機能しません。したがって、 fdpexpect が進むべき道のようです。次の場合に取得:
http://www.opensource.apple.com/source/lldb/lldb-69/test/pexpect-2.4/fdpexpect.py
次に、fdpexpect モジュールは入力としてファイル記述子を必要とします。Python Pyserial モジュール ("import serial") はクロスプラットフォームですが、fdpexpect で使用するには、Serial.fileno() メソッドを使用してシリアル ポートの int ファイル記述子を取得する必要があります。しかし、Serial.fileno() メソッドは Windows Python には存在しません。整数ファイル記述子が使用される POSIX Python にのみ存在します。
幸いなことに、Cygwin を使用して動作させることができます。Cygwin は、Windows OS 用の無料の POSIX ライクな環境です。Cygwin setup.exe を実行し、次の Cygwin パッケージを選択します。
python
nano
wget
次に、Cygwin Bash シェル プロンプトで次のコマンドを実行します。
# Install 'distribute', so we can use it to install 'pip':
wget.exe http://python-distribute.org/distribute_setup.py
# Execute the downloaded script:
python distribute_setup.py
# Now do the 'pip' installer:
wget --no-check-certificate https://raw.github.com/pypa/pip/master/contrib/get-pip.py
python get-pip.py
# Install pyserial for serial comms w/pexpect support via Serial.fileno()
pip install pyserial
ここで、Cygwin Python インストール (Windows ネイティブ Python ではない) で Python スクリプトを実行すると、Serial.fileno() の出力を fdpexpect に渡し、sendline() および expect() と通信できます。この方法を使用して、Windows で 2 つの異なる組み込みシステムと通信しています。
serial.Serial() コンストラクターは Unix では "/dev/ttyS0" のような文字列を取りますが、Windows (Cygwin を含む) では整数が必要です。COM3 には int(2)、COM4 には int(3) などを使用します。デバイス マネージャは、どの COM ポート番号を使用すべきかを教えてくれます。
...
Arduino Uno と話している場合の最後の注意事項... 私の Windows 7 システムでは、Arduino を接続すると、期待どおりに /dev/ttyS## がすぐに表示されます。ただし、シリアル ポートは、Arduino ソフトウェア シリアル ターミナル、Putty、または Cygwin の「screen」コマンドを使用して Arduino シリアル ポートを開くまで機能しません。これらのプログラムのいずれかで開いたら、プラグを抜くまで問題なく動作します。どうしてか分かりません; Arduinoドライバーのバグのようです。(Arduino 以外のデバイスに FTDI ドライバーを使用すると、この問題は発生しません。)