2016-09-01 6 views
1

したがって、送信するエコーと受信するcatを使用してデバイスと通信しています。ここに私のコードの抜粋です:Cで使用した直後にcatコマンドを終了します

fp = popen("echo "xyz" > /dev/ttyACM0 | cat - /dev/ttyACM0", "r"); 
while (fgets(ret_val, sizeof(ret_val)-1, fp) != NULL) 
{ 
    if (strcmp(ret_val, "response") == 0) 
    { 
     close(fp); 
     return ret_val; 
    } 
} 

[OK]を、問題は、私はループ内でこのコードを実行すると、それは最初の時間を動作するため、その後、私はpopenのを呼び出す場所でハングアップし、猫が開いたままのようです、です。私は猫が原因だと仮定して正しいですか?

私はコマンドを実行するとすぐにcatを終了する方法があるので、私のデバイスからの応答を取得するだけですか?ありがとう!コマンドで

+2

なぜパイプを使用していますか? 'echo'の出力はデバイスに送られるので、パイプに何も書き込まれません。 – Barmar

+0

'cat'はEOFを取得するまで読み込みを続けます。デバイスが応答後にEOFを送信しない場合は、応答全体を読み取ったタイミングをどのように知ることになっていますか? – Barmar

+3

なぜこれのために外部コマンドを使用していますか?あなたのCプログラムで '/ dev/ttyACM0'をオープンするだけです。 – Barmar

答えて

2

:キャリアが存在している、またはCLOCALがセットされるまで

echo "xyz" > /dev/ttyACM0 | cat - /dev/ttyACM0 

TTYデバイスが正常に開けないでください。猫は開いて待っているかもしれない。デバイスが開かれているとすると、(1)control-DのようなEOF文字を受信するか、(2)キャリアが失われるか、(3)あなたがそれを殺すまで、

もう1つの問題は、エコーの出力が同じTTYデバイスにリダイレクトされ、リダイレクトによってパイプが閉じられるため、echoとcatの間のパイプがすぐに閉じられることです。

一般に、TTYデバイスはオーリービーストであり、ロジックを正しく取得するには特別な処理が必要です。おそらくあなたは、特にTTYデバイス上に読み取るために優れている:

man termios 

あなたは本当に簡単な何かをやっている場合は、あなたがすることによって得る可能性があります:

fp = popen("echo 'xyz' >/dev/ttyACM0 & (read x; echo \"$x\")"); 

エコーと読み取りの両方のことを覚えておいてくださいキャリアを待っているかもしれないし、popenからの出力がたかだか1行しか得られず、読み込みがEOL文字を待っている可能性があります。

この全体的なアプローチには問題があります。 TTYデバイスには細心の注意が必要です。あなたは暗闇の中でハンマーを使用しています。

2

PIDを取得するための何のAPIがありませんようpopenによって起動プロセスを強制終了する簡単な方法は、ありません - それは、自身のアカウントの終了(およびyoueが常に使用pcloseの代わりfcloseべきまで待つだけpcloseがあります。popenによって開かFILE *を閉じるために)

を代わりに、あなたはおそらく、より良いオフにすべてpopenを使用していない - ちょうどfopenを使用し、fputsで欲しいものを書く:

fp = fopen("/dev/ttyACM0", "r+"); 
fputs("xyz\n", fp); // include the newline explicitly 
fflush(fp);   // always flush after writing before reading 
while (fgets(ret_val, sizeof(ret_val)-1, fp) != NULL) { 
      :