Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 串行通信设计模式_C#_Design Patterns_Serial Port - Fatal编程技术网

C# 串行通信设计模式

C# 串行通信设计模式,c#,design-patterns,serial-port,C#,Design Patterns,Serial Port,我目前的任务是开发一个与步进电机控制器通信的软件模块。该项目是用C语言编写的,我有一个C++ DLL与控制器通信。通信通过串行端口运行。我计划通过导入DllImport所需的方法,用C#编写整篇文章。键方法类似于: ComSendReceive(pHandle, bufferIn,sizeBufferIn,bufferOut,ref bufferOut) 有几种类型的消息: 您发送消息并期望得到确认(不是每封消息都一样,有时是可以的,有时是完整的等等) 发送消息和接收消息-您可以接收错误或数

我目前的任务是开发一个与步进电机控制器通信的软件模块。该项目是用C语言编写的,我有一个C++ DLL与控制器通信。通信通过串行端口运行。我计划通过导入DllImport所需的方法,用C#编写整篇文章。键方法类似于:

ComSendReceive(pHandle, bufferIn,sizeBufferIn,bufferOut,ref bufferOut)
有几种类型的消息:

  • 您发送消息并期望得到确认(不是每封消息都一样,有时是可以的,有时是完整的等等)
  • 发送消息和接收消息-您可以接收错误或数据(例如获取控制器ID)
  • 其他几种类型
当然,我需要控制通信超时

我的问题是:是否有任何“设计模式”可用于解决此类问题?我确信这是许多开发人员已经解决的一个相当普遍的问题

做一点贡献——我在上一份工作中处理过类似的问题,我这样解决了它:

我有一个与Com端口通信的类,还有一个带有大量重载构造函数的AT_消息类:

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

}

自从上一次我真的很匆忙,我实现了我想到的第一个解决方案。但是有没有更好的方法呢?现在我正在使用的设备比前一个更复杂,所以如果有更好的方法,我希望这样做。

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


这是一篇关于的好文章。另请参阅。

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