問題タブ [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 - ttyACM0 は 64 バイトのみを読み取ります
私は少し初心者ですが、ttyACM0 を使用してデバイスから 64 バイトの AES 暗号化データを読み取るレガシー アプリを持っています。128 バイトを読み取る必要があります。シンプルに聞こえました。バッファなどのサイズを増やします。しかし、何を試しても、まだ64バイトしか読み取れません。その後、ハングするだけです。ターミナルと cdc-acm ドライバーを使用して、Windows での通信を確認しました。デバイスはフロー制御を使用しません。コードは独自のものであるためアップロードできませんが、以下にいくつかのスニペットを示します。
初期化: CACS_RefID::Initialise() { int iRet = 1; struct termios dev_settings;
実装:
}
実装を実行する前に毎回初期化すると、128 バイトになりますが、データは 64 バイト後に破損します。それに取り組む前でさえ、私はたくさんの READ_ERROR を受け取ります。元の作成者は、デバイスが select() でブロックされることを期待していたようですが、そうではありません。
システムの ttyACM0 バッファ サイズに何らかの制限がありますか? ttyACM ドライバーでボーレートは重要ですか? read() は、すべてのバイトが読み取られた後に読み取りを停止しますか (最初の 64 バイトが使用可能で、次に空になり、さらにデータが増えると考えています)?
マニュアルページに注いでいますが、私は困惑しています。どんな助けでも大歓迎です。
ここに私の最新のものがあります:
注:選択エラーに関係なくデータを読み取っていますが、まだ64バイトしか取得していません。デバイス製造元に連絡しました。何か変なことが起きているに違いない。
c - Virtualbox には、実際のベアメタル OS とは異なるバックスペース用のバイト コードがあります。
非正規端末エミュレーションで遊んでいて、単一の文字 (入力) をバックスペースと比較しようとしています
ベアメタル OS では動作しますが、virtualbox で実行するとまったく動作しません。Virtualbox はバックスペースのみを検出します。
これは、仮想ボックスが実際のキーボード入力を妨害しているエミュレーションによるものでしょうか?
c++ - Windows から Linux へのシリアル通信
Debian を実行しているシングル ボード コンピュータに接続された Windows マシンがあり、シリアル ポートを使用してそれらの間でバイトを送受信しようとしています。Windows 側では、私のコードは次のようになります。
Linux側では、次のものがあります。
両端でコードを実行すると、while ループの最初のセットは正常に動作し、Windows マシンは 0 から 255 を表示しますread。要求されたすべてのバイトを書き込んだことを報告します。何が起きてる?
c++ - gcc と termios を使用して uint8_t の配列を Arduino に渡す
私は現在、シリアル通信の手段として termios を使用して、g++ でコンパイルされたプログラムと Arduino ATMega2560 の間のシリアル通信を必要とするプロジェクトに取り組んでいます。g++ プログラムは、Arduino によって解析される 5 つの uint8_t 値の配列を送信します。次に、Arduino はこれらのバイトを使用して、ストリップ上の特定の LED をオンにします。
以下は、g++ でコンパイルされた C++ プログラムのコードです。
そして、これが Arduino のスケッチです: #include
{}g++ プログラムの出力は、 の個別の呼び出しを示すために によってグループ化された一連のバイトとして表示できますwrite()。
arduino は最初の 2 バイトを問題なく取得し、送信される 5 つのグループごとの最初のバイトを 0x73 (「s」とも呼ばれます) として適切に解釈しますが、グループ内の次のバイトは適切に読み取られず、解釈されてしまいます。 255の値としてArduinoによって。
予想される出力は次のとおりです。
そして、これは実際の出力です:
私のコードでこれを引き起こしている原因を知っている人はいますか? 最初はバスが飽和していると思ったので、ボーレートを 19600 に下げてみましたが、何も修正されませんでした。
編集: もう 1 つの問題は、LED の設定を 4 回または 5 回繰り返した後、緑のチャネルがランダムにドロップアウトするため、Arduino が取得するのはさらに不正確な {'s', 255, 0, 255, 255} だけになることです。
linux - TERMIOS: c_oflag の OFILL フラグは何に使用されますか?
質問 1:OFILLフラグは何にtermios_p->c_oflag使用されますか?
ドキュメントの内容は次のとおりです。
時間遅延を使用するのではなく、遅延のために充填文字を送信します。
これをいじるために、この小さなテスト プログラムを作成しました。
ESCプログラムを実行すると、フラグが設定されているかどうかにかかわらず、違いは見られません...このフラグにより、キーが押されたかどうかを検出しやすくなることを望んでいました。
上記のプログラムでは、 を押したLeft-Arrow-key場合とシーケンス : を押した場合、まったく同じ出力が表示されますESC [ D。
質問 2: ユーザーがボタンを押したESCかどうか、およびユーザーが「左矢印ボタン」を押したかどうかをどのように検出する必要がありますか
これはターミナル IO システムがどのように機能するかを学習する演習であるため、ライブラリは使用したくありません。
termios - バックグラウンドで tcsetattr raw モードでプログラムを実行する
バックグラウンドでプログラムをそのまま実行する必要があります。問題は、プログラムが tcsetattr() 呼び出しを実行し、raw モードを次のように設定することです。
これは、「&」を使用してプログラムを実行し、Enter キーを押すとすぐに、プロセスが「停止」と表示されることを意味します。ps aux の出力でも、プロセスの状態として「T」が表示されます。これは、実行されていないことを意味します。このプログラムをバックグラウンドで実行するにはどうすればよいですか。問題は、このプログラムを変更できないことです。
完全な詳細については、実際にはバックグラウンド プロセスとして「sol」で ipmitool を使用する必要があります。
どんな助けでも大歓迎です! ありがとう
c++ - 分岐後にシリアルポート構成が機能しない
フォアグラウンドまたはバックグラウンドで実行できるプログラムを作成しました。プログラムは、シリアル ポートを使用して通信します。フォアグラウンドで起動すると (つまり、フォークしない)、すべて正常に動作します。コマンドラインからデーモンとして起動すると、すべて正常に動作します。
ブート中に起動スクリプトを使用してデーモンとしてバックグラウンドで起動するだけでは、常に正しいボーレートを設定できません。どういうわけか、私が設定した 9600 bps ではなく、デフォルトで 115200 bps になっているようです。シリアルポートの構成には、標準の「termios」構造と関連する関数を使用します。シリアル ポートは、ロード可能なモジュールではなく、カーネル イメージの一部です。関連するコードは次のとおりです。
明確にするために:コマンドラインからプログラムをデーモンとして実行できます(つまり、フォークします)。その後、問題なく動作します。ボーレートの構成が失敗するのは、起動時に /etc/init.d 内のスクリプトを使用してプログラムを起動したときだけです。プログラム自体はバックグラウンドで正常に実行されます。
ここで何が間違っているのでしょうか?
linux - Linux で PARMRK termio の動作が機能しない
アドレス バイトにマーク パリティを使用し、メッセージ本文にスペース パリティを使用するデバイスからメッセージを受信しようとしています。デバイスは、マルチドロップ シリアル バスの「マスター」です。termios のマニュアル ページに基づいて、私は CMSPAR、PARENB、~PARODD、INPCK、~IGNPAR、および PARMRK を使用しています。各アドレス バイトで '\377' '\0' の 3 バイト シーケンスを取得することを期待しています。それは起こりません...私は常にアドレスバイト(および本体バイト)を取得しますが、先頭の '\377' '\0' 文字は取得しません。
CMSPAR がサポートされていない場合に備えて、奇数パリティと偶数パリティのセットアップで PARMRK を動作させようとしました。データ ストリームにはまだ 3 バイト シーケンスはありません。Ubuntu 12.04 LTS を使用しています。
n_tty.c: n_tty_receive_parity_error() には PARMRK を実装するロジックがあります。8250_core.c には、パリティ エラーにフラグを立てるロジックがあります。dmesg | grep ttyS0 は serail8250 を示しています: ... は 16550A です。うーん... 後続のメッセージは 00:0a を示しています: ... は 16550A です。おそらく、8250 ドライバーは実際には ttyS0 を処理していないのでしょうか?
何か案は?私が何を間違えたのか分からなくても、PARMAR が機能するようになった場合でも、あなたの状況についてのコメントが助けになるかもしれません。
更新: 私の Linux は VMware VM で実行されているため、VM 以外の構成を試してみたところ、動作するようになりました! 誰かが知っている場合、VMでパリティエラーが検出されない理由を知りたいです。
ここに私の設定コードがあります:
linux - termios.h 構成を使用して Linux シリアル ポートがブロックされる
(1) 別のデバイスへのシリアル接続を開き、(2) 既知のコマンドを送信し、(3) 予期される応答フレーズまたは文字が検出されるまで、着信文字 (応答) のポートをチェックする組み込み Linux アプリケーションを作成しています (4 ) 一連のコマンドが送信され、応答が受信されるまでステップ 2 と 3 を繰り返し、(5) ポートを閉じます。
私のアプリは上記のシーケンスのいくつかのサイクルを通過し、組み込みのタイムアウト ロジックが原因で突然通信が停止し、ソフトウェアに障害が発生したときに応答 (読み取り) を待機していました。
ポート構成に、送信された特定のバイトが原因で (おそらく電気ノイズが原因で) ポートがブロックされる原因となるものはありますか?
ポートを開く方法は次のとおりです(termios.hを介して構成を表示します):
デバイスの電源を入れ直すと、通信が突然フリーズして消えてしまう理由がわかりません。皆さんありがとう!
詳細 - これが私の読み取りおよび書き込み機能です。
linux - シリアルポートが応答しない
termios を使用して、シリアル ポートと通信するプログラムを作成しました。このプログラムは、非ブロッキング モードでシリアル ポートを読み取り、データを読み取るとシリアル ポートに応答を書き込みます。シリアルポートから読み取ったデータがない場合、プログラムは別のことを行い、次のループでプログラムはシリアルポートを再度読み取ります。
問題は、時々、数分、または数時間経った後、シリアルポートが私のプログラムに応答しなくなったことです。実行してもecho 'HB\n' > /dev/ttyUSB0(シリアルポートは「HACK」と応答するはずです)、もう応答しません..
シリアルポートがいつ「死んでいる」のかさえわかりません。
ここに私の設定があります:
この状況でシリアルをデバッグするのは困難です。シリアルポートが地球上で「死んでいる」原因が本当にわかりません。私はほとんど狂っています...
考えられる理由は?どんな助けでも大歓迎です!
アップデート:
シリアルポートが「死んでいる」場合、その構成は次のとおりです。
更新 2
/proc/tty/driver/ar933x-uart手動でシリアルに書き込んでも、プログラムの実行中にこの値とフィールド値が変わらないことに
気付きました。txrx
/proc/tty/ドライバー/シリアル
/proc/tty/ドライバー/usbserial
そして、以下はより詳細なコードです...
他のモジュールがシリアルポートに書き込む別の機能があります