在C#中与来自不同ApiController实例的串行端口通信



我需要什么:我正在尝试使用.NET公开C#中的API,该API将允许用户通过串行端口通信控制连接到托管服务器的计算机的电机驱动程序。

我的问题:我不太确定如何允许多个ApiController类实例与(可能相同的)串行端口通信

我知道我需要使用SerialPort类,这不是我的问题

我的想法:我认为这必须通过所有不同控制器之间的共享类来完成,即我的SteeringWheelMainTelescopeMotorController需要从串行端口上的特定设备读取数据/向其写入数据,而我的SteeringWheelTiltMotorController将需要从同一串行端口上的同一设备读取数据/向其写入数据(我使用的电机驱动器支持控制多个电机)。

任何帮助都将不胜感激!

我不担心并发问题,一次只有一个用户使用API

作为一名几乎每天都在使用涉及C#和串行端口的软件的电气工程师,我可以从架构的角度为您提供一些建议。

  1. 在需要跨多个应用程序域控制电机的情况下使用此架构让一些进程/服务在后台运行,100%控制您的端口(通过API)。您可以启动一个应用程序,然后通过TCP套接字与后台服务(负责控制电机)通话。通过这种方式,您可以启动任意多的应用程序,每个人都可以访问API,而不必担心串行端口访问问题。

  2. 在需要控制单个应用程序域中的电机的情况下使用此架构这个与你在问题中已经提出的建议类似,顺便说一句,我认为这是一个很好的做事方式。实例化类以从API控制电机,然后使用构造函数/属性注入,或某种DI将对控制器的引用传递给每个需要它的人。

所以我定义了一个IMotorPort接口,它包括向电机发送和接收的异步方法,并将在其中建立SerialPort封装。然后,MotorPort类将处理诸如将字符串命令(或者更好的DTO)转换为Motor之类的问题。此外,这里还可以插入一个queing机制来处理并发请求,为了安全起见,我建议现在就这样做,而不是以后再这样做。

然后,你的控制器会在它们的构造函数中使用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;
}
}

最新更新