串行通信设计模式

时间:2011-02-07 08:58:10

标签: c# design-patterns serial-port

我目前被分配到开发软件模块以与步进电机控制器通信的任务。该项目是用C#编写的,我有一个C ++ DLL来与控制器通信。通信通过串行端口运行。我打算通过DllImport导入必要的方法在C#中编写整个部分。关键方法看起来像:

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

}

自从上次我真的很匆忙以来,我实现了第一个出现在我心中的解决方案。但有没有办法做得更好?现在,我正在与之通信的设备比前一个设备更复杂,所以如果有更好的方法,我想这样做。

1 个答案:

答案 0 :(得分:0)

这看起来像是一本教科书门面模式。所有这一切的答案都是封装你的变体。例如,尝试为提供确认的命令创建通用接口,并编写客户端代码以使用该接口。然后具体类型可以决定如何将各种确认解释为统一信号(Ok = Complete = Good,或者其他)

这是关于facade pattern的好文章。另请参阅wikipedia article