echoとcatを使用したシリアルループバックテストの予期しない結果

echoとcatを使用したシリアルループバックテストの予期しない結果

そのため、TxからRxに配線するだけで、独自にループバックする標準RS232シリアルポートがあります。私は2つの別々の端末で実行してループechoバックをテストしています。cat

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

私の問題は出力です。 catを実行している端末に「hi」が表示されると予想しましたが、結果は次のとおりです。

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

ctrl...そしてi +まで続きますc cat

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

これは普通ですか?なぜこれが起こるのか知っていますか?

編集する:改行文字はASCIIを意味します0x0A。この出力にはキャリッジリターンはありません。

答え1

Bruceの2番目のコメントのおかげで、私は直接問題を解決することができました。

実行した後、stty -a -F /dev/ttyS1問題を引き起こすオプションが「echo」、「onlcr」、「icrnl」の3つであることがわかりました。

シリアルポートが独自にループバックするため、実行後に発生する状況は次のとおりですecho "hi" > /dev/ttyS1

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

など...

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

stty -F /dev/ttyS1 -echo -onlcr

「echo」を無効にするとメッセージが無限に繰り返されるのを防ぎ、「onlcr」を無効にするとシリアルデバイスが出力時にLFをCRLFに変換するのを防ぎます。これでcat、実行するたびに「hi」(改行文字を含む!)メッセージが表示されますecho

CR = キャリッジリターン文字 (ASCII 0x0D) LF = 改行または改行文字 (ASCII 0x0A)

答え2

テストのためにファイルをシリアルttyに接続するのに同様の問題がありました。許可された回答に加えて、以下が含まれます。

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

stty簡単な操作を行うと、stty raw -F /dev/ttyS0端末が文字を挿入/置換するのを防ぐことができます(例:[...] 0x0A [...]-> [...] 0x0D 0x0A [...])。このrawフラグは端末のモードを変更して入出力処理を行いません。

関連情報