2012-11-26 62 views
5

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線式シリアルインターフェイスであったため、話していたものは気にしませんでした。私はこの質問を終わらせることができないので、私はそれをそのまま残します。

+0

あなたはインスタンスのLinuxマシン上のデバイスと通信するために、シリアル通信プログラム、minicomのを使ってみました直後

s.flush() 

を試してみてください?これにより、Pythonの実装に入る前に、Linux上でデバイスが動作することを確認することができます。 – sizzzzlerz

+0

はい - ミニコムを使って試してみましたが、回答はありませんでしたが、手動でRTSをミニコムで切り替える方法が見つからないため、Pythonを試しました。私は、pySerialがデバイスに接続してデータを送信していることを知っています(上の参考文献を参照)。 –

+0

ドライバーはどこで手に入りましたか?あなたのディストリビューションの一部ですか、それとも手でそれを構築しましたか?あなたは根源ですか? – tMC

答えて

1

はあなたs.writeコール

関連する問題