USART / USBポートを使用してユーザー制御インターフェースを実装するstm32f1制御装置があります。標準のターミナルソフトウェア(putty / minicom)を使用すると、ユーザーはデバイスシェルに簡単なコマンドを入力できます。
質問があります。着信パケットが多い場合は、シェルプロンプトを介して印刷されるため、新しいコマンドを入力することは困難です。
私はターミナル画面を2つの領域、つまり単一のラインプロンプトと受信パケットのためのスクロール可能な領域に分割する予定です。
次のエスケープシーケンスを試しました。
162 72 r * DECSTBM - Set top and bottom margins (scroll region on VT100)
[4;20r = Set top margin at line 4 and bottom at line 20
しかし、まだ私の問題を解決するのに役立つ正しい方法を説明する良いチュートリアルが見つかりません。
答え1
ソースコードを読むことは役に立ちますが、提案された例は複雑です。 OPのような最も有用なプログラムは、termcapまたはcursesインターフェースを介してエスケープシーケンスを要求します。呪いにするのははるかに簡単です。 termcapを使用するために必要な手順は次のとおりです。
- 端末の説明を取得する(カーソルの移動、スクロール領域、行の消去、インデックスを含む)
- プロンプトが保存されるように、端末を「cbreak」(セミ生)モードに初期化します。存在する一行。
- プロンプトが表示される行にカーソルを移動します。
- 行をクリア
- プロンプトを書く
- 入力コマンドを受け取る
同時に(パケットへの参照は、OPが入力を読み取っている間に入力を表示しようとしていることを示します)
- スクロール領域の一番下の行にカーソルを移動します。
- スクロール領域の設定
- 1行のパッケージを作成してください(改行文字で終わるか、次を使用してください)索引エスケープシーケンス)
- スクロール領域をデフォルト値にリセットする(全画面表示)
- カーソルをコマンドラインに戻してコマンドを読み続けます。
ベストプラクティスではスクロール領域外のカーソルアドレス指定を使用しないため、プログラムは画面の2つの部分を切り替えるたびにスクロール領域で多くの設定/リセットを実行します。
追加資料:
- 分割画面のスムーズなスクロール配列(1986年12月)
- VT100エスケープコードの使用(1996)
- 分割画面モードでは、どのくらいのトラフィックが発生しますか?(2004)
答え2
(プロンプトを下部にしてウィンドウの高さを25行に設定するとします。)
基本は次のとおりです。ユーザーのコマンドを受け入れてスクロール領域(同等)を設定printf "\033[1,24r"
し、完了したらリセットするようにデバイスのシェルを設定しますprintf "\033[r"
。