2010-07-23 41 views
2

我需要一些体系结构指导。这是我的目标。在多个应用程序之间共享单个资源(串行端口)

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

我需要提供一个服务,公开几个接口。该接口可以被称为是这样的:

IRobotArm
IGrabberAttachment
IDrillAttachment

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

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

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

想法请!

回答

3

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

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

1

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

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

这仅适用于当控制器处于它自己的进程,“锁定”关键字将无法跨越进程。另外,请不要忘记在关闭时丢弃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; 
    } 
相关问题