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