2010-07-23 42 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; 
    } 
相關問題