提问者:小点点

与 C 语言中不同 ApiController 实例的串行端口通信#


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

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

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

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

任何帮助都将不胜感激!

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


共2个答案

匿名用户

好的,作为一名几乎每天都与C#和串口相关的软件打交道的电气工程师,我可以从架构的角度给你一些建议。

>

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

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

  • 匿名用户

    因此,我定义了一个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;
       }
    }
    

    相关问题