我需要一些建筑指导。这是我的目标。
我有一个执行多种功能的机器人硬件(即它有几个不同的逻辑设备)。为了举例说明,让我们假设它是一个带有可互换附件的机器人手臂。硬件只有一个串行端口,用来连接到PC机上,因此可以由不同的应用程序来控制。arm本身和可互换附件可在单个串口上寻址。
我需要提供一个服务,公开几个接口。这些接口可以被称为类似于:
IRobotArm
IGrabberAttachment
IDrillAttachment
诸若此类。现在,这是棘手的部分。每个接口都需要被完全不同的、孤立的应用程序访问。因此,机器人手臂和抓取器附件可能由完全不同的应用程序同时控制,也可能由同一个应用程序控制。
这就是我的建筑难题。如何向多个客户端应用程序提供多个接口,同时确保只创建串行端口的一个实例,并确保命令可以正确序列化等等。
还有一个额外的要求:我将在.NET/C#中工作,但客户端应用程序很可能希望使用COM接口,因此解决方案需要使用COM Interop。
请给我主意!
发布于 2010-07-23 11:12:36
您需要一个实际打开串口并发送/接收数据的控制器进程。
暴露这些接口的DLL应该与控制器进程通信,而不是直接与串口通信。
发布于 2010-07-23 14:56:10
如果您的控制器进程(打开/关闭端口并同时发送和接收的部分)可由多个应用程序同时访问,则需要设置一些同步机制,否则两个应用程序可能尝试同时发送消息,这可能会导致解析来自机器人手臂的响应的问题。
假设您有一个控制器进程或服务正在运行,您可以只使用C#锁关键字,如下所示(假设一个简单的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;
}https://stackoverflow.com/questions/3317584
复制相似问题