問題タブ [termios]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - Linux termios VTIME が機能しない?
私たちは午前中ずっとこれについて頭を悩ませてきました。組み込み Linux デバイスと Ubuntu ボックスの間にいくつかのシリアル ラインをセットアップしました。私たちのコードは通常、実際に送信されたメッセージごとに 1 つのメッセージを読み取るのではなく、2 つ (場合によってはそれ以上、場合によっては正確に 1 つ) のメッセージを読み取るため、読み取りが台無しになります。
シリアルポートを開くコードは次のとおりです。InterCharTime は 4 に設定されています。
もう一方の端は、通信用に同様に構成されており、特定のイテレストの小さなセクションが 1 つあります。
ここで、受信マシンで読み取りスレッドを実行すると、通常、「hello world」はいくつかのメッセージに分割されます。出力例を次に示します。
ここで、数字の後にコロンが続く場合は、受信したメッセージの 1 つです。私たちが犯しているエラーがわかりますか?
ありがとうございました。
編集: わかりやすくするために、Linux Serial Programming HOWTO のセクション 3.2 を参照してください。私の理解では、VTIME が数秒 (つまり、vtime が 10 から 50 の間のどこかに設定され、試行錯誤) で、VMIN が 1 の場合、メッセージが 2 つの別々のメッセージに分割される理由はないはずです。 .
linux - 非正規端末 I/O アプリでの Linux 端末の問題
Linux で実行するように設計された C で書かれた小さなアプリがあります。アプリの一部はキーボードからのユーザー入力を受け入れ、各キーストロークに応答できるように非正規端末モードを使用します。
入力を受け入れるコードのセクションは、ループ内で繰り返し呼び出される単純な関数です。
これにより、端末から 1 文字が読み取られます。特定の時間枠 (termios 構造体の c_cc[VTIME] 値で指定) 内に入力が受信されない場合、read() は 0 を返し、get_input() が再度呼び出されます。
これはすべてうまく機能しますが、ターミナル ウィンドウでこのアプリを実行し、アプリを終了せずにターミナル ウィンドウを閉じると、アプリは終了せず、CPU を集中的に使用する無限ループに入り、read() が継続的に実行されることを最近発見しました。待機せずに 0 を返します。
では、ターミナル ウィンドウからアプリを実行した後、ターミナル ウィンドウを閉じた場合、アプリを正常に終了させるにはどうすればよいでしょうか。問題は、read() が -1 を返さないことです。そのため、エラー状態は、read() が 0 を返す通常のケースと見分けがつきません。したがって、私が見る唯一の解決策は、タイマーを入れて、次の場合にエラー状態があると想定することです。 read は、c_cc[V_TIME] で指定された時間よりも速く 0 を返します。しかし、その解決策はせいぜいハッキリしているように思えます。この状況を処理するためのより良い方法があることを望んでいました.
アイデアや提案はありますか?
c - 非同期シリアル伝送 C
だから私はプログラムに取り組んでいます.Br @yのターミナルに漠然と似ていますが、Linuxのコマンドラインから実行しています
シリアル(Com)ポートから非同期送信を行います。これに必要なヘッダー/ライブラリはtermios.hだと思います
今、私はposixを少し前に使用しただけで、manpages/specifactions http://www.opengroup.org/onlinepubs/007908799/xsh/termios.h.html \
termios の良いガイドを知っている人はいますか? 私はそれを自分でグーグルで検索しますが(疲れました)、ガイドが良いかどうかを知るのに十分なほど内容を理解していません. 私は正しいライブラリを使用していますか?
python - Linux:Python(ncurses)スクリプト、stdin、termiosにパイプします
どうやらこれは「Pythonでstdinから読み取るときの不正なパイプファイル記述子-スタックオーバーフロー」のほぼ複製です。ただし、このケースは少し複雑だと思います(そして、そのスレッドの結論がそうであったように、Windows固有ではありません)。
私は現在、Pythonで簡単なスクリプトを試しています。コマンドライン引数を使用して、スクリプトに入力を提供したいと思います。curses
または、このスクリプトに文字列を「パイプ」して、ターミナルインターフェイスを使用してスクリプトにこの入力文字列を表示させます。
ここでは、と呼ばれる完全なスクリプトをtestcurses.py
以下に示します。問題は、実際の配管を試してみると、stdinが台無しになり、curses
ウィンドウが表示されないことです。これが端末出力です。
私が見る限り、問題は次のとおりです。-文字列をPythonスクリプトにパイプするたびに、Pythonスクリプトはターミナルへの参照をとして失い、置き換えられたものは構造体ではなくなったstdin
ことに気付きます-そして、もはやターミナルではありません、何もレンダリングせずにすぐに終了します。stdin
termios
stdin
curses.initscr()
だから、私の質問は-簡単に言えば:構文echo "blabla" | ./testcurses.py -
がパイプされた文字列をで表示することになるということをどうにかして達成できますcurses
か?より具体的にはstdin
、このスクリプトが「パイプ」されている場合でも、Pythonスクリプトから呼び出し元の端末への参照を取得することは可能ですか?
ポインタを事前に感謝します、
乾杯!
PS:testcurses.py
スクリプト:
c - ユーザーが押したときに getc() がすぐに戻るように、termios 構成を変更する方法鍵?
CLI アプリケーションにオートコンプリート機能を実装したいと考えています。getc() のデフォルトの動作は、次の文字リストが入力された場合にのみ戻ります: NEW_LINE または EOF。自動補完アルゴリズムをトリガーできるように、このリストに TAB を追加したいと考えています。
たとえば、termios を使用してそれを行う方法はありますか? editline ライブラリ (http://www.thrysoee.dk/editline/) はそれを行うことができますが、どのように行うのかわかりませんでしたか?
c - 組み込みデバイスのtermiosによって切り捨てられたシリアルデータ
ARMLinux組み込みデバイスで実行されているシリアルポートをリッスンするCプログラムに取り組んでいます。
他のデータセットは正常に機能しますが、特定のデータセットを送信すると、そのセットの先頭が切り捨てられます。切り捨てられるのは次のとおりです(ターゲットで実行されているslsniffプログラムの出力)。
私は、これがテキストETXの終わりを切り捨てるために使用しているいくつかのtermios定数によって引き起こされていることをかなり確信できるように十分にデバッグしました。
今、私は次のことに取り組んでいます:
設定された区切り文字はCR0x0dであり、すべての場合に正常に機能するようです。
どんな助けでも大歓迎です。
よろしく、バート
linux - Linux tty を構成したプロセスを強制終了した後に open() するとハングするのはなぜですか?
Linux のシリアル ポートを 115200 ボーの「raw」モードに設定したいと考えています。次のプログラムを実行すると
スリープ中に Ctrl-C で中断してから再度実行すると、2 回目は出力がありません。open() 呼び出し中にプログラムがハングします。root として実行しても役に立ちません。
最初のプロセスがまだポートを使用している、またはポートがロックされているという兆候はありません。 /var/lock/ または ps aux | には何も明らかではありません。grep tty
現在の私の最善の選択肢は、tty を使用するプロセスが終了するたびに、ポートを正しく閉じるようにすることです。しかし、なぜこの問題が発生する必要があるのでしょうか。中止されたプロセスはポートを解放すべきではありませんか?
python - Python TTY コントロール
Linux/Unix マシン上で getty/agetty/mgetty プログラムがどのような機能を持っているのか、私にはよくわかりません。次のようなものを使用して、tty でシェルを開始できます。
..そして、tty3 に切り替えると、シェルが実行されますが、一部のキーストロークが無視されるか、シェルに送信されません。シェルは、TTY 設定が正しくないことを認識します。これは、bash が「tty を開けません。ジョブ制御が無効になっています」などのメッセージを表示するためです。
「termios」モジュールには、「tty」モジュールが使用する TTY の設定を変更する機能があることは知っていますが、TTY を正しく設定してシェルを開始する Python の例を見つけることができません。シンプルなものであるべきだと思いますが、どこを見ればいいのかわかりません。
*etty プログラムのソースを見ても役に立ちませんでした。C は私にはギリシャ語のように見えます :-/
多分私は正しい用語を探していないだけですか?過去に*ettyプログラムをPythonに置き換えた人がいて、共有したい説明がありますか?
私の基本的な質問を楽しませてくれてありがとう:)
escaping - termios で Escape と Up/Down/Left/Right を区別する方法は?
これは、ncurses スタイルのキー押下を処理するために私が思いつくことができる最善のものです (実際には、さまざまな理由で ncurses の代替案を書いています)。
このコードで作成されたサンプル アプリは、ユーザーに「Escape を押して終了する」ようにアドバイスします。実際には、エスケープ + エスケープまたはエスケープ + 矢印キーが必要です。これを修正したいと思います。
c - シリアルポート操作でのC読み取りコールブロッキング
LinuxでCプログラムを作成して、シリアルポートを介してマイクロコントローラーとデータを送受信しようとしています。テストとして、送信されたすべての文字をすぐにエコーするようにマイクロコントローラーを構成しました。これがminicomで機能し、「cat」と「echo」を使用してデータを送受信することによっても機能することを確認しました。
ただし、Cプログラムで同じことを行おうとすると、読み取り呼び出しが永久にブロックされます。シリアルポートを非正規モードに設定しています。MINは「1」、TIMEは「0」です。私のミニコムテストは、マイクロコントローラーが入力時に文字を返すことを証明しているので、書き込み呼び出しが文字を送信した後に読み取りが戻ることを期待しています。私は自分のコードをいくつかのオンラインの例と比較しましたが、欠けているものは何も見つかりませんでした。私は運が悪かったので、以下のコードのいくつかの順列を試しました。誰かが問題を見つけることができますか?