フォームフィード "\f" が端末を消去するように tty セッションをどのように構成しますか?

フォームフィード "\f" が端末を消去するように tty セッションをどのように構成しますか?

/dev/ttyACM0のUSBシリアル接続に接続しています。送信者のコードは\f定期的に1文字を送信します。

    print("----------------------------\n\r");
    print("-- LED CONTROLLER 00.01   --\n\r");
    print("----------------------------\n\r");
    print("\n\f");

ただし、cat /dev/ttyACM0コンソールで実行すると、出力が画面の上部から更新されるのではなく、画面の下にスクロールされます。

stty私は(入力を介して)現在の設定を掘り下げ、stty -F /dev/ttyACM0 -a次の出力を提供します。

speed 115200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^A; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke

stty --helpページを読むとページフィード遅延(ff0)が発生しますが、他の変更方法は表示されません。私も見つけました。このページこれは、FormFeed文字をこのように設定できますが、FormFeed=014構文が私のsttyバージョン(stty --version与えられたstty (GNU coreutils) 8.5)では機能しないことを示しています。

WindowsのPuttyは正しい動作をしますが、Debian 6では動作に問題があります。端末がクリアされたときにページフィードを解釈するようにsttyを設定する方法を知っている人はいますか?

答え1

この問題を解決するためにGNU sedは必要ありません(スクリプトが読みやすくなりますが)。最小スクリプトは次のとおりです(SolarisおよびOSXでテスト済み)。

sed -e 's/^L/^[[H^[[J/g'

ここで、およびは^L改ページおよびエスケープ用^[のテキスト制御文字です。 (エスケープ文字を挿入するには、最初に入力)を使用してファイルに挿入できます。controlLcontrol[vicontrolV

エスケープシーケンスは次の目的で使用されます。

  • カーソルを開始位置に移動^[[Hして
  • 明確なディスプレイ^[[J

いくつかの注意:

  • エスケープで行と列を提供する必要はありません^[[H(とにかく場所は次から始まります)。1、いいえ0)、そして
  • 画面が消えたら今後カーソルを移動するには、2エスケープにaが必要です。たとえば、^[[2Jディスプレイ全体が消去されるためです。デフォルトは、^[[J現在位置からディスプレイの終わりまで内容を消去することです。たとえば、一部の非標準端末では、ansi.sysこれらの区別は行われません。

一部の人々は、^Lbashが画面を消去するためにキーボードショートカットを使用することとPuTTYの説明に混乱しています^Lcontrol/Lを入力しても画面が消えないのはなぜですか?XTerm FAQから)。

追加資料:

答え2

\fフォームフィード文字()を正しい文字に置き換える必要があります。ANSIエスケープコード

あなたはこれを行うことができますGNU sed:

sed 's/\f/\o33[2J\o33[0;0H/g' /dev/ttyACM0

詳細:\033[2J画面消去、\033[0;0H:pos 0,0に移動

(できなかったらこうやってみてください tail -f /dev/ttyACM0 | sed 's/\f/\o33[2J\o33[0;0H/g'

編集:同様@MarkReelがコメントしました。、GNU以外のsedバージョン(BSD sedなど)では、ANSIエスケープ文字列を使用できます。

sed $'s/\f/\e[2J\e[0;0H/g' /dev/ttyACM0 

答え3

FPGAが実行されると、print("\n\f")実際には標準出力に2バイトを送信します。最初のバイトは改行文字で、2番目のバイトはフォームフィード文字です。このバイトは 0x0A と 0x0C です。

その後、標準出力はUSBケーブルを介して送信され、エミュレートされたシリアルデバイスを介して読み取られます。シリアルデバイスは制御端末(コマンドを介して読み取るためcat)に2バイトのみを送信し、最終的にgnome端末、xterm、または使用中の他のプログラムに送信します。ターミナルエミュレータはこれら2バイトを理解し、それに応じて動作する必要があります。

したがって、エミュレータの機能を確認する必要があります。どちらを使用していますか?

答え4

問題はANSI端末の正しいエミュレーションにあるため、minicomモデムを初期化せず、つまり起動時にhayesコマンドを送信せずにシリアルデバイスを開くのが最善の方法だと思います。

関連情報