在多个应用程序之间共享单个资源(串行端口)
我需要一些体系结构指导。这是我的目标。在多个应用程序之间共享单个资源(串行端口)
我有一个机器人硬件执行多个功能(即它有几个不同的逻辑设备)。为了说明起见,假设它是一种可互换附件的机器人手臂。硬件具有一个串行端口,用于连接到PC,以便可以通过各种不同的应用程序进行控制。手臂本身和可互换的附件可通过单个串口进行寻址。
我需要提供一个服务,公开几个接口。该接口可以被称为是这样的:
IRobotArm
IGrabberAttachment
IDrillAttachment
等。现在,这是棘手的部分。每个接口都需要被完全不同的独立应用程序访问。因此,机器人手臂和抓取器附件可能由完全不同的应用程序同时控制 - 或者它们可能由同一应用程序控制。
这就是我的建筑难题。如何为多个客户端应用程序提供多个接口,同时确保只创建串行端口的一个实例,并且可以正确序列化命令等。
另一个额外要求:我将在.NET/C#但客户端应用程序可能期望使用COM接口,因此该解决方案需要与COM Interop一起使用。
想法请!
您需要一个控制器进程实际打开串口并发送/接收数据。
暴露这些接口的DLL应该与控制器进程通信,而不是直接与串口通信。
如果您的控制器进程(打开/关闭端口并确实传输和接收的部分)可以被多个应用程序同时访问,您将需要放置一些同步机制,否则两个应用程序可能会尝试发送消息同时,这可能会导致解析机器人手臂反应的问题。
假设你有一个单个控制器过程或服务正在运行时,可以只使用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;
}