つまり、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
。
- この
echo
コマンドはデフォルトでメッセージの末尾に改行を追加するので、「hi」+ LFが/dev/ttyS1に送信されます。 - 「onlcr」が設定されていたため、シリアルデバイスはLFをCRLFに変換し、Txラインから送信される物理メッセージは「hi」+ CRLFになりました。
- 「icrnl」が設定されていたため、Rx ラインで受信された物理メッセージは CR を LF に変換しました。そのため、「cat」によって出力されたメッセージは「hi」+ LFLF でした。
- 「エコー」が設定されていたため、Rx で受信されたメッセージ (「hi」+ LFLF) が Tx ラインに送り返されました。
- onlcr のため、「hi」+ LFLF は「hi」+ CRLFCRLF になりました。
- icrnl により、「hi」+ CRLFCRLF は「hi」+ LFLFLFLF になりました。
- エコーのため、「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
フラグは端末のモードを変更するため、入出力処理は実行されません。