首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多个应用程序之间共享单个资源(串行端口)

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

Stack Overflow用户
提问于 2010-07-23 11:09:42
回答 2查看 2.7K关注 0票数 2

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

我有一个执行多种功能的机器人硬件(即它有几个不同的逻辑设备)。为了举例说明,让我们假设它是一个带有可互换附件的机器人手臂。硬件只有一个串行端口,用来连接到PC机上,因此可以由不同的应用程序来控制。arm本身和可互换附件可在单个串口上寻址。

我需要提供一个服务,公开几个接口。这些接口可以被称为类似于:

IRobotArm

IGrabberAttachment

IDrillAttachment

诸若此类。现在,这是棘手的部分。每个接口都需要被完全不同的、孤立的应用程序访问。因此,机器人手臂和抓取器附件可能由完全不同的应用程序同时控制,也可能由同一个应用程序控制。

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

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

请给我主意!

EN

回答 2

Stack Overflow用户

发布于 2010-07-23 11:12:36

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

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

票数 3
EN

Stack Overflow用户

发布于 2010-07-23 14:56:10

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

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

只有当控制器处于自己的过程中时,"lock“关键字才能工作。此外,当您关闭时,不要忘记释放SerialPort类。

代码语言:javascript
复制
    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;
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3317584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档