我需要什么: 我正在尝试使用.NET在C#中公开API,这将允许用户通过串行端口通信控制连接到托管服务器的计算机的电机驱动程序。
我的问题: 我不太确定如何允许多个ApiController类实例与(可能是相同的)串行端口进行通信
我知道我需要使用SerialPort类,这不是我遇到的问题
我的想法: 我想这必须通过所有不同控制器之间的共享类完成,即我的SteeringWheelMainTelescopeMotorController将需要从/向串口上的特定设备读/写数据,而我的SteeringWheelTiltMotorController将需要读取/在同一串口上从同一设备写入数据(我使用的电机驱动器支持多台电机的控制)。
任何帮助都会非常感激!
我并不担心并发问题,一次只有一个用户会使用API
答案 0 :(得分:1)
好吧,作为一名几乎每天都使用C#和串口软件的电气工程师,我可以从建筑的角度为您提供一些建议。
在需要跨多个应用程序域控制电机的情况下使用此架构。在后台运行一些流程/服务,100%的时间控制您的端口(通过您的API)。您可以启动应用程序,然后通过TCP套接字与后台服务(负责控制电机)进行通信。这样,您可以根据需要启动任意数量的应用程序,并且每个人都可以访问API,而无需担心串行端口访问问题。
在需要在单个应用程序域中控制电机的情况下使用此架构。这类似于您已在您的建议中提出的建议。 问题,顺便说一下,我认为这是一种非常好的做事方式。实例化类以控制API中的电机,然后使用构造函数/属性注入或某种DI将控制器的引用传递给需要它的每个人。
答案 1 :(得分:0)
所以我定义了一个IMotorPort接口,它包括用于发送和接收电机的异步方法,并在其封装中建立SerialPort。然后,MotorPort类将处理诸如将字符串命令(甚至更好的DTO)转换为Motor的问题。此外,这将是插入排队机制来处理并发请求的地方,我建议现在这样做,而不是为了安全起见。
然后您的控制器将在其构造函数中使用IMotorPort,并且您的引导程序将确保它们属于同一实例。
public interface IMotorPort
{
Task SendData(string data);
Task<string> RecieveData();
}
public class MotorPort : IMotorPort
{
protected SerialPort Port{get;set;}
public Task SendData(string data)
{
//TODO: Send from Serial Port
}
public Task<string> RecieveData()
{
//TODO: Recieve from Serial Port
}
}
public class SteeringWheelMainTelescopeMotorController
{
protected IMotorPort Motor{get;set;}
public SteeringWheelMainTelescopeMotorController(IMotorPort motor)
{
this.Motor = motor;
}
}
public class SteeringWheelTiltMotorController
{
protected IMotorPort Motor{get;set;}
public SteeringWheelTiltMotorController(IMotorPort motor)
{
this.Motor = motor;
}
}