2011-02-07 52 views
3

私は現在、ステッピングモータコントローラと通信するソフトウェアモジュールを開発するタスクに割り当てられています。このプロジェクトはC#で書かれていますが、コントローラと通信するためのC++ DLLがあります。通信はシリアルポート経由で実行されます。私はDllImportで必要なメソッドをインポートすることによって、C#で全体を書くつもりです。シリアル通信デザインパターン

  • 、あなたがメッセージを送信し、すべてのメッセージの確認は、(同じではありません期待して、時にはそれが時にはそれがなどCOMPLETEだ、OKです:

    ComSendReceive(pHandle, bufferIn,sizeBufferIn,bufferOut,ref bufferOut) 
    

    あり、メッセージのいくつかのタイプがある:キーメソッドは次のようになります。あなたがメッセージを送信し、メッセージを受け取る

  • - あなたは
  • いくつかの他のタイプの
(例えばGET_CONTROLLER_IDのために)エラーやデータを受信することができます

もちろん、タイムアウトの通信を制御する必要があります。

私の質問です:このような問題に使用するデザインパターンはありますか?これは多くの開発者がすでに解決している共通の問題だと私は確信しています。

少し貢献する - 私は私の最後の仕事で同様の問題に対処し、私はそれをこのように解決:

私が過負荷コンストラクタの束を使用して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私は本当に急いで、私は自分の頭に来た最初のソリューションを実装しました。しかし、それをより良くする方法はありますか?私が通信しているデバイスは以前のものよりも複雑なので、それをよりうまくやる方法があれば、そうしたいと思います。

+0

各メッセージの後に、データを読み込み、各「メッセージ」の後にメッセージ受信イベントをトリガするために、(実行中の)whileループを使用することができる「改行」文字を使用していますか。 – CodingBarfield

+0

通信を同期または非同期にしますか?あなたのコードでは、 "Response = ... SendMessage(...)"は、応答が受信されるまでブロックするように見えますか? –

+0

同期通信です。通信は厳密に単一スレッドでなければならない。 – Biggles

答えて

0

これは教科書のファサードパターンのようです。このすべてに対する答えは、バリエーションをカプセル化することです。たとえば、肯定応答を与えるコマンド用の汎用インターフェースを作成し、そのインターフェースを使用するためのクライアント・コードを作成してみてください。次に、具体的なタイプは、さまざまな承認を一意の信号に解釈する方法を決定することができます(Ok =完全= Good、その他)

ここではfacade patternの良い記事です。 wikipedia articleも参照してください。