シリアル通信ポートに接続された計測器があります。Windows XP で Python 3.2 と pySerial モジュールを使用しています。通信ポートを開き、構成し、文字列を書き込み、通信ポートから文字列を受信する一連のステートメントで構成されるスクリプトを実行すると、問題が発生します。これらの文字列は、機器に関連するコマンド (制御) または機器からの応答 (応答) のいずれかです。
これらのステートメントが Python インタープリターで対話的に (>>> で) 実行されると、期待どおりの結果が得られ、結果は適切で正しいものになります。ただし、インタープリター内またはシェルからスクリプトを実行すると、必要なものが得られません。スクリプト内のステートメントは、対話型インタープリターで使用するものと同じです。
奇妙な動作をするのはなぜですか? また、対話型インタープリターのように動作するようにスクリプトを変更するにはどうすればよいですか?
def read(comport):
wrt_str=b'movt 3000'+b'\r\n'
ret_str=comport.write(wrt_str)
wrt_str=b'scan'+b'\r\n'
ret_str=comport.write(wrt_str)
rsp_str=comport.readlines() #########1
wrt_str=b'hllo'+b'\r\n'
ret_str=comport.write(wrt_str)
rsp_str=comport.readlines()#########2
問題は、上記の ####### の行にあります。対話モードでは、#1 で約 1 秒、#2 で 9 秒の遅延があります。私はそこで正しい反応を得ます。しかし、上記のスクリプトを実行すると、遅延はまったくなく、間違った結果 (ゴミ) が得られます。通信ポートのセットアップで読み取りタイムアウトを0に設定しました。
comport.timeout=0
そのため、comport が行末またはファイルの終わりを待つ場合は、ブロック モードにする必要があります。
更新 (2011 年 8 月 19 日)
数日前に作成した元の投稿を更新しました。私は問題が何であるかを知っていると思います。誰かが解決策を持っているかどうか知りたいです:
すべてのステートメントの後に「print」と「time.sleep(delay)」を配置した後、スクリプトが実行されているときに、「comport.write(..)」や「comport.readlines」などの pyserial ステートメントを回避しているように見えることがわかりました。 (...)" pyserial コマンドの実行中 (シリアル ポートが遅いことがわかります)。たとえば、Python インタラクティブ シェルですべてのステートメントを実行すると、前のステートメントが返されない場合、新しいステートメントを入力して実行することができません。そうですね、comport.readlines() が返されない場合、次の comport.write(...) ステートメントを入力して実行することはできません。ただし、実行中のスクリプトでは、comport.readlines() が読み取りでビジーである場合、次のステートメントが実行中であり、次のステートメントが読み取りを中止する comport.write() である場合です。
Pythonスクリプトを正確に順番に実行するように強制する方法はありますか?