【问题标题】:Sharing a single resource (serial port) between multiple applications在多个应用程序之间共享单个资源(串行端口)
【发布时间】:2010-07-23 11:09:42
【问题描述】:

我需要一些架构指导。这是我的目标。

我有一个执行多种功能的机器人硬件(即它有几个不同的逻辑设备)。为了便于说明,假设它是一个带有可互换附件的机械臂。该硬件具有一个用于连接 PC 的串行端口,因此可以由各种不同的应用程序控制。机械臂本身和可互换附件可通过单个串行端口进行寻址。

我需要提供一个服务,它暴露了几个接口。接口可能被称为:

IRobotArm
IGrabber附件
IDrill附件

等等。现在,这是棘手的部分。每个接口都需要由完全不同的、独立的应用程序访问。因此,机器人手臂和抓取器附件可能同时由完全不同的应用程序控制 - 或者它们可能由同一个应用程序控制。

这就是我的建筑难题。如何为多个客户端应用程序提供多个接口,同时确保仅创建一个串行端口实例并且可以正确序列化命令等。

另外一个要求:我将使用 .NET/C# 工作,但客户端应用程序很可能希望使用 COM 接口,因此该解决方案需要使用 COM Interop。

请出主意!

【问题讨论】:

    标签: .net architecture client-server


    【解决方案1】:

    您需要一个控制器进程来实际打开串口并发送/接收数据。

    暴露这些接口的 DLL 应该与控制器进程通信,而不是直接与串行端口通信。

    【讨论】:

      【解决方案2】:

      如果您的控制器进程(打开/关闭端口并进行传输和接收的部分)可以同时被多个应用程序访问,您将需要设置一些同步机制,否则两个应用程序可能会尝试同时发送消息,这可能会导致解析机器人手臂的响应时出现问题。

      假设你有一个单一的控制器进程或服务正在运行,你可以只使用 C# lock 关键字,如下所示(假设一个简单的 ASCII 类型协议)

      这只有在控制器在自己的进程中才有效,“lock”关键字不会跨进程工作。也不要忘记在关闭时处理 SerialPort 类。

          Object _access = new Object();
          SerialPort _port;
      
          public void Open()
          {
              lock( _port )
              {
                  if( _port == null )
                  {
                      _port = new SerialPort("COM1", 9600, Parity.None, 8,StopBits.One );
                      _port.Open();
                      _port.NewLine = "\r";
                  }
              }
          }
      
          public void Close()
          {
             // TBD
          }
      
          public string SendAndRecieve( string cmd )
          {
              String response;
      
              lock( _access )
              {
                  // Assume port is already opened
                  _port.WriteLine(cmd);
                  response = _port.ReadLine();
              }
      
              return response;
          }
      

      【讨论】:

        猜你喜欢
        • 2011-10-07
        • 1970-01-01
        • 2012-06-03
        • 1970-01-01
        • 2011-06-06
        • 2018-03-17
        • 2018-01-01
        • 2014-06-04
        相关资源
        最近更新 更多