画面をシリアル端末として使用し、キーを押してCR + LF自動モードをシミュレートする方法

画面をシリアル端末として使用し、キーを押してCR + LF自動モードをシミュレートする方法

screenをシリアル端末として使用したいのですが、出力形式が正しくありません。私は次のコマンドを使用します。

sudo screen /dev/ttyACM0 9600,cs8

上記の設定がパリティとフロー制御の設定を持たない9600 8N1と同じであると考えると、次の結果が表示されます。

This program runs since 135 seconds.
                                                This program runs since 136 seconds.
                                                                                    This program runs since 137 seconds.
                    This program runs since 138 seconds.
                                                        This program runs since 139 seconds.
                                                                                            This program runs since 140 seconds.
                                This program runs since 141 seconds.

CR LF auto modeQTKTermでは、設定メニューを設定するまで同じ結果が得られました。

This program runs since 759 seconds.
This program runs since 760 seconds.
This program runs since 761 seconds.

画面で同じ結果を得るにはどうすればよいですか?

ご協力ありがとうございます。

ベストアンサー1

TLDR: できません。 stty設定で渡されたすべてのオプションは、画面の起動時に無視されます。ocrnl/onlcr/icrnl/inlcrキャリッジリターンと改行を設定するために必要なオプションはサポートされていません。端末デバイスを排他モードで開くため、画面が起動した後はsttyを使用してこれらのオプションを変更することはできません。これは、2020年2月5日のScreenバージョン4.08.00(GNU)にも当てはまります。

長いテーブル:

私も同じ問題に遭遇し、スタック交換で関連するいくつかの質問と回答を検索してみました。私はこのような結論を出すしかなかった。画面\nでキャリッジリターン(CR; \r)の代わりに改行(LF;)を送信することはできません。、少なくともソースコードを変更して再コンパイルせずに。

この問題CRの代わりに画面からLFを送信する方法を尋ねます。まだ答えがありません。この回答 間違っています(stty -F /dev/YOURSERIALDEVICE YOURBAUDRATE raw画面がttyの設定方法を変更していません)。この回答Picocomが提案されましたが、正しい改行文字を送信するように画面を取得する方法に関する質問には答えません。しかし、動作します。

picocom /dev/YOURSERIALDEVICE --baud YOURBAUDRATE --omap crcrlf --echo
# (press Control+a Control+x to exit)

この問題を解決する方法についていくつかのヒントがあります。画面sttyのマニュアルページから。 Screenはttyファイルの後にカンマで区切られたオプションのリストをsttyに渡すので、次のオプションのいくつかが役に立ちます。

> man stty
# (output abridged..)
Input settings:
       [-]icrnl    translate carriage return to newline
       [-]inlcr    translate newline to carriage return
Output settings:
       [-]ocrnl    translate carriage return to newline
       [-]onlcr    translate newline to carriage return-newline
       [-]onlret   newline performs a carriage return

ただし、入力と出力\rを に切り替えるように設定し、 に変わらないことを\n確認し、設定されていないことを確認することは... あまり差がなく、\n\ronlret

screen /dev/YOURSERIALDEVICE YOURBAUDRATE,ocrnl,-onlcr,icrnl,-inlcr,-onlret

動作は以前と同じです。なぜ画面にこれらのオプションが適用されないのか分かりません。この回答不明瞭に同様の問題については、sttyを使用してオプションを変更することをお勧めします。

> stty -F /dev/YOURSERIALDEVICE YOURBAUDRATE ocrnl -onlcr icrnl -inlcr -onlret
> screen /dev/YOURSERIALDEVICE

起動時にsttyによって行われたすべての設定は画面がリセットされるため、これは何もしません。この回答sttyを実行できると主張する後ろに画面が起動しますが、これを行うとエラーが発生しますDevice or resource busy

この回答また、画面のCR/LF問題も解決しました。それは以下を指すウィンドウタイプオンラインマニュアルの画面セクション。

  • 「接続回線を使用中としてマークするために、ノードで排他オープンを試みます。」- したがって、起動画面の後にttyオプションを変更することはできません。

  • baud_ratecs8/cs7(バイトあたりのビット)ixon/offとオプションのみが文書istrip化されています。これは、画面がocrnlなどを認識/サポートしていないことを意味できます。

簡単に言うと:\nCR()の代わりにLF()を送信するように画面を取得する方法に関する質問は、\rさまざまなスタック交換サイトで何度も要求されました。提供された答えのどれもうまくいかず、文書を注意深く読むと、これは現在不可能であることがわかります。

おすすめ記事