問題タブ [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.
c - 入力を待つ代わりに EOF を返す標準入力の read()
次のコードを実行すると、その fd (標準入力) での将来のすべての read() 呼び出しが、入力をブロックする代わりにすぐに 0 を返す理由を知っている人はいますか?
tcsetattr 行を削除すると、read() が期待どおりに動作するようになります。
また試しました:
運がない。
現在、2つの異なる端末があることに注意してください。それらのいずれかでアプリを実行すると、読み取りが即座に返されます。他の場所で実行すると、読み取りが入力のためにブロックされます。どうなり得るか?
前もって感謝します :-)
再現ソース:
linux - 不明な理由でシリアル ポート ブロックを読み取る
Linux で termios フレームワークを使用して、UART (usbserial) 経由で非接触型スマート カード リーダーに接続しようとしています。コードは PC で正常に動作しますが、クロスコンパイルして ARM9 ターゲットで試してみると、デバイスを開き、デバイスにコマンドを書き込むことさえできますが、読み取りコマンドは無期限にブロックされます。コード スニペットは次のとおりです。
mifare_1K 構造体には、シリアル デバイスのファイル記述子、termios 構造体、および使用しているさまざまなバッファーが含まれています。私が言及したデバイスは、usb-to-serial (モジュール: ftdi_sio) デバイスです。termios の Canonical モードで 38400@8-N-1 に設定されています。
リーダーからの応答が '\n' で終わるため正規モードです。したがって、'\n' が受信されるまでデバイスを読み取るため、正規モードでより適切に処理されます (間違っている場合は修正してください)。
最初に init() fn を呼び出し、次に get_rdr_version() を呼び出します。「cmd sent, read version...」という文字列が出力されるので、書き込み可能であることがわかりますが、「reading done.」という文字列は出力されません。その後。
もう 1 つの問題は、カード リーダーを取り外して、そのポートを別の PC の gtkterm (シリアル ポート ターミナル プログラム) に接続すると、その gtkterm で「$1V\n」が表示されないことです??!! . 次に、少しRnDした後、リーダーがリーダーに接続されているシステムを再起動すると、他のGtktermでそのコマンド「$ 1V\n」しか取得できないことがわかりました。再起動せずに再試行すると、そのコマンドはそのGktermに表示されません...手がかりですが、まだ理解していません。
cmdがデバイスファイルに書き込まれているが、実際のデバイスには排出されていないようなものですか? これをチェックする方法はありますか?
私はこのfrでしばらく立ち往生しているので、どんな助けも深く感謝しています....thnks。
アップデート :
OK、以下に示すようにコードを少し変更することで機能するようになりました。
これは、init() 関数でポートを開くコードの変更されたセクションです。2 つの変更:
1) O_NDELAY が open() 呼び出しのフラグに追加されます。これは、データ キャリア検出 (DCD) ラインを無視して、相手側が接続され、通信の準備ができているかどうかを確認します。これはもともと必要のない MODEM に使用されていたもので、実際には usbserial を使用しているため、まったく持っていません。ただし、このフラグはさらに read() および write() をノンブロッキングとして呼び出します。注意点として、termios 構造体の cflag に CLOCAL を追加することでこれが解決されると思っていましたが、試してみましたが機能しませんでした。
2) fcntl(fd,F_SETFL,0) は、以降の read() および write() 呼び出しのブロッキング動作を復元します。
このコンボは私にとって完璧に機能しています。これを回答として投稿しない唯一の理由は、同じハードウェアであるため、この変更なしで PC で動作した理由をまだ理解していないためです。実際、 minicomを使用して ARM9 TARGET のスマート カード リーダーからデータを読み取ることはできましたが、私のプログラムではできませんでした。FT232BL のドキュメントをチェックして、デフォルトで DCD のステータスがどのようなものかを確認します。
とにかく、POSIXオペレーティングシステムのシリアルプログラミングガイドでこの情報を見つけました。説明誰か??? もちろん、答えが分かり次第追記します。
乾杯 :)
python - Linux ターミナル バッファ内の余分な文字を確認する
Python で関数を実装しようとしましたがgetch()、F1-F12 や矢印キーなどの特殊キーの文字のリストも返す必要があります。これらの特別なキーは、連続して複数の文字を生成します。したがってgetch()、ブロッキング モードで 1 文字を読み取り、入力バッファに余分な文字があるかどうかを確認して、それらも取得する必要があります。
call をtermios.FIONREADioctlと共に使用して、入力バッファー内のバイト数を取得しています。バッファにスタックされた非特殊キーの押下をキャッチしますが、特殊キーからの余分な記号は見逃します。2 つの異なるバッファーがあるようです。誰かがこれを説明してくれたらうれしいです。
インタラクティブな例を次に示します。
sleep(1)途中注意。この秒が切れる前に 1 つのキーを押すと、出力は次のようになります。
1 秒間に 5 つの通常のキー (「asdfg」など) を入力すると、出力は次のようになります。
ただし、単一の矢印キーの場合、出力は次のようになります。
ここで 2 つの質問があります。
通常のキー押下でキュー内の 4 つのシンボルが破棄されるのはなぜですか? 「生」端末モードに切り替えたためですか?
getch()端末を「生」モードのままにしなくても、後続の実行のために文字を保持するにはどうすればよいですか?ioctl特別なキーを 1 回押すだけのバッファが空になるのはなぜですか? それらのキャラクターは、その後のgetch()実行のためにどこから来ていますか? それらを確認する方法は?
c - VTIME および VMIN シリアル ポート オプションは select で機能しますか?
と を使用してシリアルポートを読み取る Linux プログラムがselect()ありread()ます。正常に動作しますが、パフォーマンスの問題があります。
read()プログラムは、1 回の呼び出しで 1 ~ 4 バイトのデータしか受信しません。そして、それは不必要なオーバーヘッドを引き起こします。
問題を回避するために、VTIME を 20 (2 秒) に、VMIN を 9 に設定しました。
select()ただし、使用可能なバイトが 1 ~ 4 バイトしかない場合でも、すぐに戻ります。プログラムからのトレース:
私の質問は次のとおりです。
VTIME および VMIN シリアル ポート オプションは で動作しselectますか?
それが機能するはずなのに、なぜselect復帰が早すぎるのでしょうか?
非正規モードが使用されます。シリアル ポートの構成は次のとおりです。
objective-c - USB-to-serial アダプタと通信すると、このシリアル通信コードがハングするのはなぜですか?
Mac Mini のデスクトップからプロジェクターを制御するアプリケーションを作成しています。Xcode と termios.h を使用してシリアル ポートと通信する Objective-C でアプリケーションを作成しています。USB-to-Serial アダプタから接続していますが、HEX コマンドをプロジェクタに送信してその機能を制御できるため、ドライバが正しくインストールされていることがわかっています。
シリアルポートを開き、プロジェクターに接続し、コードを送信し、切断する必要があると思われるコードを書いています。
プログラムを実行するとハングするので、どこが間違っているのか疑問に思っていました。
c - Windows への POSIX C コードの移植
シリアル ポートからデータ ストリームを読み取り、受信データを解析する、C で書かれた小さなプロジェクトを完成させました。このソフトウェアは POSIX システム (termios を使用) 用に書かれており、標準的な手順に従ってシリアル I/O を操作します。
- open() を使用してシリアル デバイスを開く
- 通信パラメータ(termio)の設定
- ファイル ハンドル (fcntl) にブロッキング モードを設定する
- シリアル インターフェイスで read() を実行します。
- 完了したら、シリアル インターフェイスで close() を実行します。
ソケット部分以外はそのままANSI Cです。
私の質問は、Windows プラットフォームでコードを機能させるにはどの程度の作業が必要かということです。移植は私が書いたものではありません。移植に興味があるかもしれない他の人に指示を与えたいだけです(つまり、些細なこと、それほど些細なことではない、狂気を誘発するあなたの目を引き裂きます)。
また、誰かが「Windows Services for UNIX」を備えた Windows を使用している場合、コードを変更せずに使用できますか?
だから、誰かがこれを経験したことがあれば、教えてください。
c++ - 再起動せずにUbuntuおよびC/C++でUSBデバイスを取り外す方法
私はtermiosを備えたCプログラムを使用して、Ubuntuを搭載したPCとUSBモーターコントローラーの間で情報とコマンドを交換しています。
それはうまく機能し、シリアルポートを介してメッセージを正常に送信することができます。ただし、プログラムを間違った方法で閉じたり、何か別のことが起こったりすると、USBデバイスに再接続できなくなることがあります。
デバイスに再度接続できるようにするには、PCを再起動して、ubuntuを再起動する必要があります。
この問題を回避し、毎回システムを再起動せずにUSBポートを再度有効にするための解決策を見つけたいと思います。
最初に、usbポートを使用していたすべてのプロセス(sudo killall -9 program_name)を強制終了しようとしましたが、ポートはブロックされたままなので、再起動する必要があります。
再起動を回避するための解決策を教えてください。そして、なぜそれが起こるのですか?
次の方法でUSBポート(/ dev / ttyACM0)に接続します。
c - ttys0 はデータの欠落/文字化けを起こしますが、ttyusb0 はそうではありません
termios を使用する c のプログラムは、ポートが ttyusb0 の場合はうまく機能しますが、ttys0 経由、つまり comport com1 経由で取得した場合、データが失われたり文字化けしたりします。
プログラムは ubuntu 9.04 & 10.04 で動作します
この不一致の原因を解決する方法を提案してください。
c - 非正規の ICANON でバックスペースなしを回避する方法
以前の質問で提案されたように termios を使用していますが、非標準モードで termios を使用しているときにバックスペースを取得する方法があるかどうかを尋ねています。持っていないために termios を使用していますecho私が使用&=ECHOし、&=ICANONこれが私が望む結果である場合、キーが押されて表示されるとすぐにキーボード入力が putchar() に送信されますが、'\b'キーは として表示されますhex。 Enter キーを押すまでテキストが表示されませんが、'\b'機能します。マニュアルを調べましたおよび彼らが「不可能であり、間違いを犯さないでください」と述べた他のいくつかのフォーラム、これは、Ubuntuのターミナルでパスワードを正しく入力しないと、バックスペースして変更できないことを考えると理にかなっています. しかし、私はマニュアルで何も見逃していないことを確認していました.
コードは stdin から入力を取得し、空行を表示しないようにします。
ありがとうラクラン
PS私の研究の側面で、Termiosは「標準C」ではないと誰かが言っているのに気づきました。これはシステムに依存しているためですか? (コメントのみ)