USB /シリアルアダプタが内蔵されたデバイスがあります(Prolific PL2303として表示されます)。デバイスのドキュメントには、通信方法の詳細が記載されており、Windowsアプリケーションのサンプルが提供されています。しかし、私はそれをLinux上で使う必要があります。理想的にはPythonを使うのですが、私はあまり貴重ではありません。Pythonでの半二重シリアル通信
デバイスの状態はデバイスが9600、半二重の8N1で動作していることを示します。 Windowsアプリケーションはうまく動作します。デバイスは正常に動作します(デバイスの問題ではないことが分かります)。しかし、私はLinux上でPythonを使ってそれと通信することはできません。私はpySerialを使用していますが、同様の(全二重のPL2303も)正常に動作するデバイスを試しました。
xonxoff、rtsctsなどのいくつかの組み合わせを試しました。setRTS(True)とCTSとDSRなどを使ってRTSトグルを試みましたが、すべてFalseを返します。私は正常にpySerialを使用してデバイスを開くことができます(私はアクティビティライトが点滅する - シンプルだが効果的なテストを見ることができます)、pySerialは読み書き中にプラグを抜くと文句を言います。
私が設定したフラグ/行や送信するデータに関係なく、常に同じ結果が得られます。
>>> s=serial.Serial()
>>> s.port('/dev/ttyUSB1')
>>> s.open()
>>> s
Serial<id=0x7fe94b533b50, open=True>(port='/dev/ttyUSB1', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=3, xonxoff=0, rtscts=0, dsrdtr=0)
>>> s.write('\2CMD2292\r')
>>> s.inWaiting()
0
>>> s.setRTS(True)
>>> s.getCTS()
False
(several iterations of above with different flags).
書き込みコマンドのデータを無視します。これは単なるステータスチェックコマンドです。何がそこに行くかは関係ありません、デバイスは答えかエラーで応答する必要があります。
私は、さまざまなctsrtsフラグなどを設定したり、リセットを強制的に解除したりリセットしたりする間に、デバイスを閉じて再オープンすることに頼っていました。上記のように、Windowsテストアプリケーションを使用して正常に動作し続けます。私は64ビットWin7のインストールであるので、Windowsのポートトラフィックを盗聴するためにPortmonなどを使用することはできません。現在、XPマシンを構築する時間はありません。
どのような考えですか?
更新:デモアプリケーションと同じWindowsボックスでPythonを使って上記のすべてを試してみました。間違いなくポートを開いて通信しますが、書き込まれた内容に関係なく情報は戻されません。
UPDATE2:デバイスドライバ関連のようです。いくつかの追加の背景研究は、PL2303チップの中には半二重をサポートする機能があることを示唆していますが、これはLinuxドライバではサポートされていません。 Windowsのデモアプリケーションには専用のデバイスドライバが付属しており、デフォルトのWindowsドライバを使用するクリーンなテストマシンでは動作しません。これは、私がPythonを通して正常に接続することができても、(例えばSTX/ETXの方法でも)二重通信を制御することができないと思うので、これは絶望的なケースかもしれません。 sigh。
UPDATE3:下記のコメントありがとうございます。しかし、私はこれをどのような方法でも見つけることができませんでした。私はUSBプロトコルアナライザを試しましたが、ドライバを逆アセンブルしようとしましたが、ちょうど時間がかかりましたので、最後にデバイスを分解して、ちょっとした工夫をしてから、既存のUSBシリアルアダプタを適切なPL2303部品 - デバイス側では、基本的な2線式シリアルインターフェイスであったため、話していたものは気にしませんでした。私はこの質問を終わらせることができないので、私はそれをそのまま残します。
あなたはインスタンスのLinuxマシン上のデバイスと通信するために、シリアル通信プログラム、minicomのを使ってみました直後
を試してみてください?これにより、Pythonの実装に入る前に、Linux上でデバイスが動作することを確認することができます。 – sizzzzlerz
はい - ミニコムを使って試してみましたが、回答はありませんでしたが、手動でRTSをミニコムで切り替える方法が見つからないため、Pythonを試しました。私は、pySerialがデバイスに接続してデータを送信していることを知っています(上の参考文献を参照)。 –
ドライバーはどこで手に入りましたか?あなたのディストリビューションの一部ですか、それとも手でそれを構築しましたか?あなたは根源ですか? – tMC