echo と cat を使用してシリアル ループバックをテストすると予期しない結果が発生する

echo と cat を使用してシリアル ループバックをテストすると予期しない結果が発生する

つまり、Tx から Rx にワイヤを配線するだけでループバックされる標準 RS232 シリアル ポートがあります。2つの別々のターミナルでechoとを実行してループバックをテストしています。cat

cat /dev/ttyS1
echo "hi" > /dev/ttyS1

問題は出力にあります。cat を実行している端末に 1 つの「hi」が返されることを期待していましたが、代わりに次のメッセージが表示されます。

hi
[2 newlines]
hi
[4 newlines]
hi
[8 newlines]
hi
[16 newlines]
hi
[32 newlines]
hi

...そして、I ctrl+になるまでこれを繰り返しますc cat

cat を中断した後、再度実行しても、echo を 2 回目に実行するまで「hi」は出力されません。

これは正常ですか? このような動作が見られるのはなぜでしょうか?

編集: 改行とは、ASCII を意味します0x0A。この出力には復帰改行はありません。

答え1

ブルースの2番目のコメントのおかげで、私は自分で問題を解決することができました。

を実行した後stty -a -F /dev/ttyS1、問題の原因となる 3 つのオプション、「echo」、「onlcr」、および「icrnl」が見つかりました。

このシリアル ポートは自身にループバックされるため、実行後に次のようになりますecho "hi" > /dev/ttyS1

  1. このechoコマンドはデフォルトでメッセージの末尾に改行を追加するので、「hi」+ LFが/dev/ttyS1に送信されます。
  2. 「onlcr」が設定されていたため、シリアルデバイスはLFをCRLFに変換し、Txラインから送信される物理メッセージは「hi」+ CRLFになりました。
  3. 「icrnl」が設定されていたため、Rx ラインで受信された物理メッセージは CR を LF に変換しました。そのため、「cat」によって出力されたメッセージは「hi」+ LFLF でした。
  4. 「エコー」が設定されていたため、Rx で受信されたメッセージ (「hi」+ LFLF) が Tx ラインに送り返されました。
  5. onlcr のため、「hi」+ LFLF は「hi」+ CRLFCRLF になりました。
  6. icrnl により、「hi」+ CRLFCRLF は「hi」+ LFLFLFLF になりました。
  7. エコーのため、「hi」+ LFLFLFLFLFが送信されました。

等々...

この問題を解決するために、次のコマンドを実行しました。

stty -F /dev/ttyS1 -echo -onlcr

「echo」を無効にすると、メッセージの無限ループが防止され、「onlcr」を無効にすると、シリアル デバイスが出力時に LF を CRLF に変換するのが防止されます。これで、 をcat実行するたびに 1 つの「hi」(改行が 1 つ) が受信されるようになりましたecho

CR = キャリッジリターン (ASCII 0x0D); LF = ラインフィードまたは改行 (ASCII 0x0A)

答え2

私も、テストのためにシリアル tty にファイルを連結する際に同様の問題を抱えていました。受け入れられた回答に加えて:

次のような操作を行ってシリアル出力をテストする場合cat somefile.txt > /dev/ttyS0、正確なバイト値をテストすると、予期しないバイト データが大量に発生します。

stty単純な を実行すると、stty raw -F /dev/ttyS0端末での文字の挿入/置換が停止します (例: [...] 0x0A [...]-> [...] 0x0D 0x0A [...])。rawフラグは端末のモードを変更するため、入出力処理は実行されません。

関連情報