web-dev-qa-db-ja.com

シリアルデバイスからCRのみを受信して​​いるときに、画面を一列に並べて最初から開始するにはどうすればよいですか?

画面を使用してシリアルポートに接続しています:_screen /dev/cu.usbserial-A703XAOG_。反対側のデバイスは、キャリッジリターンのみを別の行に送信します。画面は、キャリッジリターンを受信したときに行の先頭からのみ開始し、行を下に移動しないため、出力の最後の行を次の出力行で上書きします。

シリアルポートのicrnl設定を変更すると、キャリッジリターンがラインフィードに変換されます。画面は次の出力行を書き込む前に1行下がっていますが、改行のみを受信した場合は最初から開始されません。

を使用して.termcapファイルをダンプしました Ctrl-A、 Ctrl+.。私はtermcapを読んで、それを学びました:

端末に次の行の最初の列に移動するコマンドがある場合、そのコマンドはnw(改行)として指定できます。

ソース

これが私の現在の_~/.screenrc_ファイルです:

_termcap SC nw=^M
_

SCは、ダンプされた.termcapファイルの名前と一致します。

これは私が望んでいた効果を与えません。多分termcapコマンドは行く方法ではありませんか?

シリアルデバイスからCRのみを受信して​​いるときに、画面を一列に並べて最初から開始するにはどうすればよいですか?

編集:

画面がシリアルポートに接続されている場合の_Sudo stty -f /dev/cu.usbserial-A703XAOG -a_の出力は次のとおりです。

_speed 9600 baud; 0 rows; 0 columns;
lflags: -icanon -isig iexten -echo echoe echok echoke -echonl echoctl
        -echoprt -altwerase -noflsh -tostop -flusho -pendin -nokerninfo
        -extproc
iflags: -istrip -icrnl -inlcr -igncr -ixon -ixoff -ixany -imaxbel -iutf8
        -ignbrk brkint -inpck ignpar -parmrk
oflags: -opost -onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd -hupcl clocal -cstopb -crtscts -dsrflow
        -dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = ^@; eol2 = ^@;
        erase = ^?; intr = ^C; kill = ^H; lnext = ^V; min = 100;
        quit = ^\; reprint = ^R; start = ^Q; status = ^T; stop = ^S;
        susp = ^Z; time = 2; werase = ^W;
_

編集:

一部のソフトウェアがこれを解決する可能性があることを理解しています。たとえば、 PuTTY では、「暗黙のLF in」を有効にする必要があります。すべてのCR」設定、および Serial で「スタンドアロンCRをCRLFとして解釈する」を有効にする必要があります。しかし、私の質問は特にscreenに関するものです。シリアルポートに接続するために現在使用しているソフトウェア。

編集:

画面はVT100端末をエミュレートし、制御シーケンス( source )を認識する必要があります。 「自動改行モード」( 改行モード とも呼ばれます)を設定する必要があります。これは、パラメータ値20のセットモード制御シーケンスを使用して実行する必要があります:_ESC [ 20 h_。

この制御シーケンスを画面に渡すにはどうすればよいですか?

私にとってうまくいったように思えたのは、見つけた改行モードのエスケープシーケンスを画面に送信し、それにキャリッジリターンを改行に変換するsttyコマンドを与えることで、画面の疑似ttyを操作することでした。使用する ps a ptyを見つけるには:

16947 pts/4    Ss+    0:00 screen -S myscreen /dev/ttyS0

次にコマンドを実行します

pty=/dev/pts/4
stty -F $pty  ocrnl
echo -en '\e[20h' >$pty
1
meuh