4

私は、さまざまなサードパーティのライブラリと、.Netでの低遅延シリアル通信へのアプローチを研究してきました。私は十分に読んだので、今では完全に一周し、意見の対立がさまざまであるため、始めたときと同じくらいほとんど知りません。

たとえば、「Microsoftが提供するソリューションはフレームワークのバージョン間で安定しておらず、機能が不足している」という説得力のある記事があったため、フレームワークの機能は除外されました。

古いCOMベースのライブラリの多くをバッシングする記事を見つけました。ガベージコレクションが原因で、低レイテンシの.Netアプリ全体のアイデアを非難する記事を見つけました。

また、低遅延通信を目的としたP / InvokingWindowsAPI機能が受け入れられないことを示す記事も読みました。

このルールは、私が考えることができるあらゆるアプローチについてです!

そこにいた/その経験をした人たちからのいくつかの言葉を本当に感謝します。理想的には、堅実なライブラリ/パートナーを見つけることができ、コミュニケーションライブラリを自分で構築する必要はありません。私には次の簡単な目的があります。

  • C#/VB.Netでの持続的な低遅延シリアル通信
  • 32/64ビット
  • 十分に文書化されている(ソリューションがサードパーティの場合)
  • ガベージコレクションによる影響は比較的ありません(通信および遅延に関して)。
  • 柔軟性(将来何とインターフェースする必要があるかわかりません!)確かに必要な唯一の要件は、RS485ベースのリニアアクチュエータ、シリアル/マイクロコントローラなどのさまざまな産業用デバイスとインターフェースできる必要があることです。ベースのゲージ、およびModBus(RS485)デバイス。

私の混乱を和らげる可能性のあるコメント、アイデア、考え、記事へのリンクは大歓迎です!

4

5 に答える 5

3

最新のマシンでは、レイテンシーは問題になりません。シリアルポートは氷河的に遅く、19.2キロボーはピーナッツであり、.NETSerialPortクラスはそれらをうまく処理します。DataReceivedイベントは、WaitCommEvent()でブロッキング待機を実行するスレッドプールスレッドによって非同期的に配信されます。それより速く進むことはできません。

于 2010-04-27T03:40:42.590 に答える
2

私は16個のCOMポートを備えたサーバーで実行される.NETアプリケーションを持っており、そのうちの約11個は現在、さまざまなデバイス、一部のRS485、多くのRS-232に接続されています。(図はこちら: http: //blog.abodit.com/2010/03/home-automation-block-diagram/)。これらのデバイスのほとんどは9600ボーしか実行しておらず、ほとんどのデバイスには非常に厳しいタイミング要件はありません。デバイスごとに受信を処理するスレッドがあり、通常のスレッド優先度で実行されますが、他のすべての非通信スレッドは低い優先度で実行されます(とにかくほとんどのバックグラウンドタスクで実行する必要があります)。この設定に問題はありません。また、マネージコードの優先度の高いスレッドと1秒のDSoundバッファーを使用して、3つのサウンドカードで同時に音楽を再生します。すべてグリッチは発生しません。

では、遅延要件、ボーレート、およびサービスを提供しようとしているシリアルポートの数はどれくらい厳しいのでしょうか。ほとんどの通常のボーレートでのUARTのバッファは、ガベージコレクションには十分すぎるほどであり、次のバイトの取得を遅らせるにはさらに多くのことが必要です。

GCは、それがそうであるように作られているほど邪悪ではありません。オブジェクトのサイズとライフタイムを適切に管理し、十分なバッファリング(UARTS /サウンドバッファなど)を備えた、適切に優先順位が付けられたスレッドシステムでは、非常に優れたパフォーマンスを発揮します。Microsoftも継続的に改善しており、.NETFramework4はバックグラウンドのガベージコレクションを提供するようになりました。この機能は、以前のバージョンの同時ガベージコレクションを置き換え、パフォーマンスを向上させます。MSDNを参照してください。

于 2010-04-27T03:45:47.907 に答える
1

.NETは、一般的に、説明する種類のアプリケーションには適していません。この種のことは、少なくとも低レイテンシーを必要とする部分のために、ネイティブコードとC++のような言語を必要とするでしょう。

于 2010-04-27T03:14:22.890 に答える
0

.Netシリアルポートクラスは、高周波で小さなパケットを受信して​​送信するときに、CPUを大量に消費します。また、いくつかのイベントを見逃しているようです。16バイトのパケットを1秒あたり1000回確実に送受信できる必要があるため、Windows APIに基づいたものをまとめることになり、CPUをほとんど消費せずに、1秒あたり1000個の小さなパケットを簡単に起動できるようになりました。利用可能なほぼすべてのライブラリライブラリを試しましたが、この単純なタスクでは、CPU使用率が高すぎるか、イベントを見逃したために、すべて失敗しました。

于 2011-12-17T23:22:28.107 に答える
0

個人的にはBBUSBインターフェースが大好きです。ビットバンモードに切り替えると、入力または出力に設定できる8ピンのオン/オフ制御を指示できます。

「しかし、シリアルポートが必要です。」あなたは言う。それは完全に可能です。ピンを9ピンのオスシリアルポートに配線するだけで、準備完了です。

于 2010-04-27T03:14:10.440 に答える