USB /シリアルアダプタが組み込まれたデバイスがあります(Prolific PL2303として表示されます)。デバイスのドキュメントには、デバイスとの通信方法の詳細と、サンプルのWindowsアプリが記載されています。ただし、Linuxで使用する必要があります。理想的にはPythonで使用しますが、それについてはそれほど貴重ではありません。
デバイスのドキュメントには、デバイスが9600、8N1、ハーフデュプレックスで実行されていると記載されています。Windowsアプリは正常に動作します-デバイスは正常に動作します(したがって、デバイスの問題ではないことがわかります)。ただし、LinuxでPythonを使用して通信することはできません。私はpySerialを使用しており、正常に動作する同様の(全二重、PL2303も)デバイスを試しました。
xonxoff、rtsctsなどの設定のいくつかの組み合わせを試しました。また、setRTS(True)を使用してRTSを切り替え、CTSやDSRなどをチェックしてみました。すべて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テストアプリを使用しても引き続き正常に動作します。Portmonなどを使用してWindowsポートトラフィックをスニッフィングすることはできません。これは64ビットのWin7インストールであり、現在XPマシンを構築する時間がないためです。
何かご意見は?
更新:デモアプリが動作するのと同じWindowsボックスでPythonを使用して、上記のすべてを試しました。それは間違いなくポートを開いて通信しますが、何が書かれているかに関係なく、再び情報は返されません。
UPDATE2:デバイスドライバーに関連している可能性があります。いくつかの追加の背景調査は、一部のPL2303チップが半二重をサポートする機能を備えていることを示唆していますが、これはLinuxドライバーではサポートされていません。Windowsデモアプリには専用のデバイスドライバーが付属しており、デフォルトのWindowsドライバーを使用するクリーンなテストマシンではアプリは動作しません。これにより、Pythonを介して正常に接続できますが、二重通信を制御できない(たとえば、STX / ETXの方法でも)ため、これは絶望的なケースである可能性があります。 ため息。
UPDATE3:以下のコメントをありがとう。しかし、私はこれを回避する方法を見つけることができませんでした。USBプロトコルアナライザーを試し、ドライバーを分解しようとしましたが、かなり時間がかかったので、最終的にデバイスを分解し、いじくり回した後、既存のusb-シリアルアダプターを適切なPL2303パーツに交換することができました-デバイス側では、基本的な2線式シリアルインターフェイスであるため、何が通信しているのかは気になりませんでした。この質問を閉じることができないようですので、そのままにしておきます。