問題タブ [virtual-serial-port]
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++ - タイム クリティカルなループで 200 ミリ秒フリーズする理由を特定する
問題の新しい説明:
現在、新しいデータ取得ソフトウェアをテスト環境で実行しています。このソフトウェアには 2 つのメイン スレッドがあります。1 つには、ハードウェアと通信してデータをデュアル バッファにプッシュする高速ループが含まれています。数秒ごとに、このループは 200 ミリ秒フリーズします。いくつかのテストを行いましたが、ソフトウェアが何を待っているかを理解することはできませんでした。ソフトウェアはかなり複雑で、テスト環境もソフトウェアに干渉する可能性があるため、レコーダー スレッドが 200 ミリ秒ブロックされている間に何を待機しているかをテストするためのツール/手法が必要です。これを達成するには、どのツールが役立ちますか?
元の質問:
データ取得ソフトウェアには、主な機能を提供する 2 つのスレッドがあります。1 つのスレッドがさまざまなセンサーからデータを収集し、2 つ目のスレッドがデータを大きなブロックでディスクに保存します。データはダブル バッファに収集されます。通常、アイテムごとに 100000 バイトが含まれ、1 秒あたり最大 300 アイテムを収集します。1 つのバッファーはデータ収集スレッドでの書き込みに使用され、1 つのバッファーはデータの読み取りと 2 番目のスレッドでのディスクへの保存に使用されます。すべてのデータが読み取られると、バッファが切り替えられます。バッファの切り替えは、主要なパフォーマンスの問題のようです。バッファーが切り替わるたびに、データ収集スレッドが約 200 ミリ秒ブロックされますが、これは長すぎます。ただし、切り替えがはるかに高速で、ほとんど時間がかからない場合があります。(テスト PC: Windows 7 64 ビット、
私の推測では、パフォーマンスの問題はコア間で交換されるデータに関連しているということです。スレッドがたまたま同じコアで実行されている場合にのみ、交換ははるかに高速になります。両方のスレッドが同じコアで実行されるようにスレッド アフィニティ マスクを設定することを考えましたが、これは実際の並列処理が失われることも意味します。もう 1 つのアイデアは、切り替え前にバッファがより多くのデータを収集できるようにすることでしたが、新しいデータにアクセスする前にバッファが切り替わるのを待たなければならないため、データ表示の更新頻度が大幅に低下します。
私の質問は次のとおりです。収集スレッドを妨げずに、あるスレッドから別のスレッドにデータを移動する手法はありますか?
編集: ダブル バッファーは、リング バッファーとして使用される 2 つの std::vectors として実装されます。bool (int) 変数は、どのバッファがアクティブな書き込みバッファであるかを示すために使用されます。ダブル バッファがアクセスされるたびに、bool 値がチェックされ、どのベクトルを使用する必要があるかが判断されます。ダブル バッファーでバッファーを切り替えることは、この bool 値を切り替えることを意味します。もちろん、トグル中はすべての読み取りと書き込みがミューテックスによってブロックされます。このミューテックスが 200 ミリ秒ブロックしている可能性はないと思います。ところで、200 ミリ秒は各スイッチ イベントで非常に再現性があります。
java - Java を使用して仮想シリアル ポートを作成する方法
TelnetSerialPort と jSSC ライブラリを使用して仮想シリアル ポートを作成しようとしましたが、機能しません。仮想シリアル ポートを作成せず、既存のシリアル ポートを通信に使用します。
これはjSScライブラリを使用した私のプログラムです
次の出力が得られます
vb.net - VB.NET SerialPort.Write(string) がキャッチできない例外をスローし、COM ポートを壊す
私は VB.NET SerialPort クラスを使用しており、ハードウェア デバイスの構成を表すオブジェクトのコレクションを作成して、構成を変更し、USB 仮想シリアル ポートを介してデバイスを更新できるようにしました。これらのオブジェクトはポリモーフィックな性質を持ち、各デバイスは最終的に COM IO を処理する CmdSender と呼ばれるクラスから継承します。最終的にすべての既知のバグを削除し、アプリケーションを別の PC (.NET ランタイムがインストールされているが Visual Studio はインストールされていない) に公開すると、コードから SerialPort.Write(string) を呼び出すと、キャッチできない例外がスローされることがあります。
これはエラー メッセージであり、スタック トレースの一番上の部分です。
System.IO.IOException: システムに接続されているデバイスが機能していません。
System.IO.Ports.InternalResources.WinIOError(Int32 errorCode、文字列 str) で System.IO.Ports.SerialStream.EndWrite(IAsyncResult asyncResult) で System.IO.Ports.SerialStream.Write(Byte[] 配列、Int32 オフセット、 Int32 カウント、Int32 タイムアウト) System.IO.Ports.SerialPort.Write(String text) at TDDevice.CmdSender.SendPure(String Cmd, Boolean AddCheckSum)
この問題の解決策がオンラインで見つかりません。また、この例外がスローされた場合、アプリケーションを単純に再起動することはできませんが (それでもまだ理想的ではありません)、USB COM デバイスを取り外してマシンに再挿入する必要があることにも注意してください。これを行わないと、私のアプリケーションは COM ポートがないことを警告します見つけることができます(私が組み込んだチェック)、これは.NETがこの後COMポートと対話できないことを示しています.これが発生した後も他のAPIがポートを使用できるかどうかを確認するためにまだテストしていません.問題が .NET だけに影響するのか、それともポート自体に影響するのか (ただし、デバイス マネージャーにはまだポートが表示されます)。
私の質問は、なぜこれが起こっているのか、どうすれば防ぐことができるのでしょうか? (うまくいけば翻訳できるので、C#での回答は問題ありませんが、VBをいただければ幸いです)
c# - 端末に比べて仮想コンポートが非常に遅い
仮想シリアルポート経由で別のユニットにファイル (~600kB) を送信する必要があるアプリケーションを作成しています。
端末アプリ(TeraTerm)を使って送信すると10秒もかからないのですが、私のプログラムを使えば1~2分かかります。
私のコードは非常に単純です:
ファイル全体の長さで port.Write を呼び出すと、不明な理由で常に書き込みタイムアウトが発生するようです。そのため、一度に 1 バイトずつ書き込みます。