代码之家  ›  专栏  ›  技术社区  ›  Tim Long

在多个应用程序之间共享单个资源(串行端口)

  •  2
  • Tim Long  · 技术社区  · 14 年前

    我需要一些建筑指导。这是我的目标。

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

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

    伊罗博塔姆
    igrabborattachment公司
    Idrillattachment公司

    等等。现在,这里是棘手的部分。每个接口都需要由完全不同的独立应用程序访问。因此,机械臂和抓取器附件可能由完全不同的应用程序同时控制,也可能由相同的应用程序控制。

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

    还有一个附加要求:我将在.net/c中工作,但是客户端应用程序很可能希望使用com接口,因此解决方案需要使用com互操作。

    好主意!

    2 回复  |  直到 14 年前
        1
  •  3
  •   Stephen Cleary    14 年前

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

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

        2
  •  1
  •   mdenomy    14 年前

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

    假设您有一个单独的控制器进程或服务正在运行,您可以只使用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;
        }