【问题标题】:Serial communication design pattern串行通信设计模式
【发布时间】:2011-02-07 08:58:09
【问题描述】:

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

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

有几种类型的消息:

  • 您发送消息并期待确认(并非每条消息都相同,有时没问题,有时是 COMPLETE 等。
  • 您发送消息和接收消息 - 您可以接收错误或数据(例如 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

}

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

【问题讨论】:

  • 您是否在每条消息后使用“换行符”字符,您可以使用 while(运行)循环(在后台线程上)读取数据并在每个“消息”之后触发消息接收事件。
  • 您希望通信是同步的还是异步的?在您的代码中,“Response = ...SendMessage(...)”看起来像您在收到响应之前一直阻塞?
  • 是同步通信。通信必须是严格的单线程。

标签: c# design-patterns serial-port


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2010-10-14
    • 2011-07-22
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 2020-05-26
    • 1970-01-01
    相关资源
    最近更新 更多