/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が を解釈すること^L
(Ctrl/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 コマンドを送信せずにシリアル デバイスを開くことを忘れないでください。