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


17

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

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

私の問題は出力にあります。catを実行している端末に「こんにちは」が戻ってくるのを期待しますが、代わりにこれを取得します。

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

...など、I ctrl+ までc cat

catを中断した後、再度実行すると、エコーを2回実行するまで「hi」は出力されません。

これは正常ですか?この動作が見られる理由は何ですか?

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


同じデバイスを開く2つのプロセスが原因である可能性はありますか?実行tip /dev/ttyS1~.終了)し、そこでデータを入力しようとした場合はどうなりますか?送信されたものを受信するため、ワイヤが接続されたときに端末に表示されるはずです。
Mrb

3
本当に改行を受け取っています、それとも改行と改行のペアですか?区別は、作業中のレベルで重要です。「cat / dev / ttyS1> somefile」を試してから「od -x somefile」を実行して、TTYデバイスファイルから出力されるバイトを正確に確認します。また、「stty -F / dev / ttyS1 -a」を実行します。「stty」のmanページを読んで、小さな設定ごとにsttyの出力が示す内容を見てください。RS232シリアル通信には注意が必要です。
ブルースエディガー

回答:


21

ブルースの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」+ LFLFLFLFが送信されました

等々...

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

stty -F /dev/ttyS1 -echo -onlcr

「エコー」を無効にすると、メッセージの無限ループが防止され、「onlcr」を無効にすると、シリアルデバイスが出力でLFをCRLFに変換できなくなります。これcatで、実行するたびに1つの「こんにちは」を(1つの改行で!)受け取りますecho

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


-icrnl私のためにトリックをしました。
tcpaiva

3

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

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

sttyシンプルにやってstty raw -F /dev/ttyS0文字を置き換える/挿入から端末を停止します(例:[...] 0x0A [...]- > [...] 0x0D 0x0A [...])。このrawフラグは端末のモードを変更するため、入出力処理は実行されません。


1
うーん...はstty rawデフォルトではエコーを無効にするように見えません。あなたがする必要があるかもしれませんstty raw -echo
BMiner
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.