串行通信设计模式

4

我目前被指派开发一个与步进电机控制器通信的软件模块,该项目使用C#编写,我有一个用于与控制器通信的C++ dll。通信通过串口进行。我计划通过DllImport导入必要的方法,在C#中编写整个代码。关键方法看起来像:

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

有几种类型的消息:

  • 您发送消息并期望确认(每个消息的情况不同,有时是OK,有时是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(running)循环(在后台线程上)读取数据,并在每个“消息”后触发消息接收事件。 - CodingBarfield
你想让通信是同步还是异步的?在你的代码中,“Response = ...SendMessage( ... )”看起来像是你会一直阻塞,直到收到响应? - Frank Osterfeld
这是同步通信。通信必须严格单线程。 - Biggles
1个回答

0
这似乎是一个典型的外观模式。解决这个问题的关键是封装你的变化。例如,尝试为能够提供确认的命令创建一个通用接口,并编写客户端代码来使用该接口。然后具体类型可以决定如何将各种确认转换为统一的信号(例如Ok = Complete = Good,或其他方式)。
这是一篇关于外观模式的好文章。还可以参考维基百科文章

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接