シリアルポート経由でバイトを送受信するSerialClient
というクラスがあります。 SerialClient.Start()
が呼び出されると、無限のwhileループに入り、SerialClient.Stop()
が呼び出されます。クラスにはいくつかのプロパティがありますが、簡略化のためにSerialClient.PropA
、SerialClient.PropB
と言うことができます。MVPを使用してスレッドでシリアルポートを実行しています
私はこれをGUIで使用する必要があります。 GUIのどこで、開始、停止、プロパティの変更を読み込むことができますか。
GUIでこれを使用するには、明らかにSerialClient
を無限ループとしてスレッドで操作する必要があります。だから、私はSerialClient
のそれに一致するプロパティを持つビューをセットアップしました。ビューは、発表者のStart()
とStop()
を呼び出します。
私は新しいスレッドを作成し、SerialClient
のオブジェクトでstartを呼び出します。問題は、_serialClientがプレゼンターがキャッチできない例外をスローし、(SerialClient.PropB
)のようなプロパティが変更され、変更されたイベントハンドラーを呼び出す場合、GUIスレッド上で呼び出される必要があります。私はバックグラウンドワーカーを使用しようとしましたが、それを動作させることができませんでした(プロパティの変更は、まだUI以外のスレッドからUIにぶつかります)。
Thread thread = new Thread(_serialClient.Start);
thread.IsBackground = true;
thread.Start();
私が見ている簡単な解決策が必要です。 GUIは単にメソッドを呼び出してプロパティを読み込み、例外がアプリケーション全体をクラッシュさせないようにするだけです。
アイデア?
あなたはErrorReceivedとDataReceivedを処理しています¿か? –
.Net SerialPortクラスについてそうでなければ。 SerialClientクラス内。 OpenCOM()メソッドがあります。これにより、正しい設定でCOM5にSerialPort(_comport)が作成され、それが開きます。このすべてはStart()内にあり、OpenCOM()が呼び出された後、無限ループを含むSendReceivedDataメソッドに対して新しいスレッドが作成されます。ここでは、データがある場合は_comport.BytesToReadを読み取り、_comport.Read(/ *ここでデータを読み込みます* /)、送信するデータがある場合は_comport.Writeを使用します(/ * my data here//) 。 – JonWillis
はい、バイトをループを使用しないでください。DataReceivedイベントでエラーを試してください。可能であればエラーに対してErrorRecievedを実行してください。その後、シリアルポートによってDataReceivedが呼び出されると、すべてのデータを読み込み、デリゲートを呼び出します。 –