私は現在、ステッピングモータコントローラと通信するソフトウェアモジュールを開発するタスクに割り当てられています。このプロジェクトはC#で書かれていますが、コントローラと通信するためのC++ DLLがあります。通信はシリアルポート経由で実行されます。私はDllImportで必要なメソッドをインポートすることによって、C#で全体を書くつもりです。シリアル通信デザインパターン
- 、あなたがメッセージを送信し、すべてのメッセージの確認は、(同じではありません期待して、時にはそれが時にはそれがなどCOMPLETEだ、OKです:
ComSendReceive(pHandle, bufferIn,sizeBufferIn,bufferOut,ref bufferOut)
あり、メッセージのいくつかのタイプがある:キーメソッドは次のようになります。あなたがメッセージを送信し、メッセージを受け取る
- - あなたは
- いくつかの他のタイプの
もちろん、タイムアウトの通信を制御する必要があります。
私の質問です:このような問題に使用するデザインパターンはありますか?これは多くの開発者がすでに解決している共通の問題だと私は確信しています。
少し貢献する - 私は私の最後の仕事で同様の問題に対処し、私はそれをこのように解決:
私が過負荷コンストラクタの束を使用してCOMポートとクラスAT_messageと通信するためのクラスを持っていた:
class AT_Message
{
public bool DoResponseCheck;
public string ExpectedResponse;
public AT_COMMAND command;
public string data;
public bool AddCarriageReturn;
...
//Plenty of ctors
}
class UnfriendlyInterface
{
Response SendMessage(AT_Message msg)
{
//Communicates directly with C++ dll, send message, check timeouts etc....
}
}
そして、私はそれが最後のティムので
class FriendlyInterface
{
bool AutodetectPortAndOpenComm();
Result AnalyzeSignal(byte[] buffer)
{
Response response = UnfriendlyInterface.SendMessage(new Message(AT_Command.PrepareForSignal, (doResponseCheck)true, ExpectedResponse.Ok,Timeout.short);
Response response = UnfriendlyInterface.SendMessage(new Message(buffer,(doResponseCheck)false,Timeout.long);
//.... Other steps
}
//... other methods
}
のような人間に優しい方法を持っていた、メインアプリケーションが通信したクラスを持っていましたe私は本当に急いで、私は自分の頭に来た最初のソリューションを実装しました。しかし、それをより良くする方法はありますか?私が通信しているデバイスは以前のものよりも複雑なので、それをよりうまくやる方法があれば、そうしたいと思います。
各メッセージの後に、データを読み込み、各「メッセージ」の後にメッセージ受信イベントをトリガするために、(実行中の)whileループを使用することができる「改行」文字を使用していますか。 – CodingBarfield
通信を同期または非同期にしますか?あなたのコードでは、 "Response = ... SendMessage(...)"は、応答が受信されるまでブロックするように見えますか? –
同期通信です。通信は厳密に単一スレッドでなければならない。 – Biggles