私はPCとのIR通信のための組み込みデバイスを構築しています。これには2つの単方向IR Led /検出器ペアがあり、次のように設定されます。 IRソース入力コマンド - >コマンドを受信するために組み込みデバイスの近くに配置された検出器、埋め込み近くにあるIRソース監視出力用 - >監視データを取得するための外部デバイス用の出力の近くの検出器。
ハードウェアでこれを実装する最も簡単な方法は、各IR /検出器ペアに対して別々の一方向シリアル通信ポートを持つことです。 1つ目はコマンド転送用、2つ目は出力監視用です。
/dev/ttyUSB1
私のLinux PCの場合は、とリストされている2つの別々のシリアルポートがあります/dev/ttyUSB2
。私が望むのは、1つのttyUSBを入力として使用し、もう1つを出力として使用しながら、端末を介して単一の双方向ポートとして両方のポートにアクセスできることです。
仮想デバイスソリューションで/dev/
十分ですが、必ずしも必要ではありません。 minicom(またはその代替品)などのプログラムが2つの独立したポートで反応するようにした場合、新しい仮想デバイスは必要ありません。
問題はPC側でのみ発生し、ソフトウェアで修正する必要があると思います。この問題に対する解決策がない場合は、いくつかのカスタムハードウェア多重化/バッファリングを追加して、これら2つのポートから単一の通信ポートを作成することもできます。
編集:私の問題がどこにあるかをよりよく説明するために(ややおおよそのドラフト)画像を追加しました。
ベストアンサー1
私はminicomが行う呼び出しを無視するために動的ライブラリ(LD_PRELOAD
あなたがそれを作成する必要がある)を使用します。open()
私はそれに多くがあるとは思わない。read()
write()
ioctl()
close()
Googleの「ld_preloadオーバーライド」を使用すると、この技術の多くの例を見つけることができます。
- minicomコマンドを使用して
strace
呼び出し内容を確認してください。 open()
ライブラリの上書きを開始してください。- 存在しないttyデバイス名を定義します。例:
/dev/mytty
- 次に、このttyを介してminicomを実行します。
- 実装
open()
では、このデバイス名と一致します。- 一致したら、実際のttyUSBペアを開く必要があります。
- fallbackがtrueと一致しない場合
open()
open()
このライブラリはminicomが呼び出すすべてのライブラリを置き換えるため、ファイル名が一致しない場合〜しなければならない実際の値に置き換えます(open()
オーバーライドするすべての呼び出しだけでなく)。
tty ペアが正常に開かれると、有効なファイル記述子が返され、そうでなければエラーが返されます。
ライブラリでこのファイル記述子を使用して、より多くの情報(たとえば、実際のttyの2つのファイル記述子)をリンクしたいと思います。
他の呼び出しの場合、一致する必要があるのはファイル記述子です。 openから返されたファイル記述子と一致する場合、呼び出しはttyUSB1に/dev/mytty
ある場合はrealを呼び出し、ttyUSB2にある場合はrealを呼び出そうwrite()
とします。記述子が実際の呼び出しと一致しない場合は、実際の呼び出しに置き換えられます。write()
read()
read()
ioctl パラメーターによっては、一部の ioctl は読み取り装置、一部は書き込み装置、一部ioctl()
は両方に移動する必要があります。
編集する
select()
おそらくminicomのようにうまく作られた端末は非ブロックアプローチを使用しているので、orのような呼び出しをラップするpoll()
必要があります。
編集する
これタイピングが続く同じ技術を使用してさまざまな問題を解決します。