フォーム フィード `\f` 文字が端末をクリアするように tty セッションを構成するにはどうすればよいでしょうか?

フォーム フィード `\f` 文字が端末をクリアするように tty セッションを構成するにはどうすればよいでしょうか?

/dev/ttyACM0 の USB シリアル接続に接続しています。送信側のコードは、\f一定の間隔で文字を送信しています。

    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、 と は^[フォームフィードcontrolLとエスケープのリテラル制御文字ですcontrol[。 これらをファイルに挿入するには、 を使用しますvi(エスケープ文字を挿入するには、まず と入力しますcontrolV)。

エスケープシーケンスは、

  • カーソルをホームポジションに移動し^[[H
  • 表示をクリアする^[[J

いくつかの注意事項:

  • エスケープでは行と列を指定する必要はありません^[[H(いずれの場合も、位置は1、 ない0)、 そして
  • 画面がクリアされた場合前にカーソルを移動するには、2エスケープに が必要です (例: )。^[[2Jこれは、ディスプレイ全体をクリアするためです。デフォルトでは、^[[J現在の位置からディスプレイの最後までがクリアされます。たとえば、いくつかの非標準端末では、ansi.sysこの区別がありませんでした。

bashが画面をクリアするためのキーボードショートカットとして を使用すること^Lや、PuTTYが を解釈すること^LCtrl/L を入力しても画面がクリアされないのはなぜですか?XTerm FAQ を参照してください。

参考文献:

答え2

フォームフィード文字(\f)を適切なものに置き換える必要がありますANSI エスケープコード

これは次のように行うことができますGNU sed:

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

詳細:\033[2J画面をクリア、\033[0;0H: 位置 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")実際には stdout に 2 バイトが送信されます。最初のバイトは改行で、2 番目のバイトはフォーム フィードです。これらのバイトは 0x0A と 0x0C です。

次に、stdout は USB ケーブル経由で転送され、エミュレートされたシリアル デバイス経由で読み取られます。このシリアル デバイスは、両方のバイトを制御端末に転送します (コマンド経由で読み取っているためcat)。そして最終的には、gnome-terminal、xterm、または使用しているその他のプログラムに転送されます。この端末エミュレーターは、両方のバイトを理解し、それに応じて動作する必要があります。

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

答え4

問題は ANSI 端末の正しいエミュレーションに関するものなので、最良の選択肢は でシリアル-USB コンバーターに接続することだと考えますminicom。モデムを初期化せずに、つまり起動時に Hayes コマンドを送信せずにシリアル デバイスを開くことを忘れないでください。

関連情報