私は、シリアルインターフェースを介して接続されているように、無線送信機 - 受信機(NRF24L01)を使用して2つのデバイスを接続するように設計された一連のプログラムを作成しました。
現時点では、デバイスAからBにbashコマンドを一方向に送信できます。私のAデバイスは現在AVRマイクロコントローラです。
私のBデバイスはRapberry Piです。次のコマンドを使用して、受信したテキストをbashにパイプします。これによりコマンドを送信できますが、出力をAデバイスに送り返すことはできません。
./program | bash
私はプログラムが受信したデータに反応するのをブロックまたは防止する方法でbashの出力を私のプログラムに再パイプする方法を知りません。パイプを双方向に設定することは可能ですが、カットオフなどのfgets
機能を使用することはできません。
どちらのデバイスも同じ送受信機能ライブラリを共有し、それを非ブロック化するオプションで呼び出すことができます。
答え1
最も簡単な方法は、おそらくプログラムを使用することです。pipe2
3回繰り返して、3つのパイプ(stdin、stdout、およびstderr用の1つ)を作成します。おそらくあなたは彼らが非ブロックモードになることを望むでしょう。その後、フォークで刺して子供を使用させます。dup2
ファイル記述子0、1、2にパイプを置きます。その後、サブプロセスは次のいずれかを使用します。役員家族ランニングbash
。
その後、親は次のものを使用できます。select
読み取るデータがあるか、書き込む領域があるかを確認します。
いくつかのライブラリまたは既存の実装を利用できます。
注#1:pipe2
2つのファイル記述子が返されます。 1つはパイプの読取り側用、もう1つはパイプの書込み側用です。たとえば、bashの標準入力の場合、bashには読み込み側(入力を読み取るため)が必要で、プログラムには書き込み側(bashの入力に書き込むため)が必要です。 Bashの標準出力では、その逆が適用されます。 Bash には書き込み側が必要で、プログラムには読取り側が必要です。
注#2:これは完全な端末体験を提供しません。これを行うには、ptysを処理する必要があり、これは多くの複雑さを追加します(正直に言うと、探す必要がありました)。これが必要な場合は、同様のプログラムを見つけて始めることをお勧めします。