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

C# 在C中与来自不同ApiController实例的串行端口通信#,c#,asp.net,.net,web-applications,serial-port,C#,Asp.net,.net,Web Applications,Serial Port,我需要的是: 我正试图使用.NET在C#中公开一个API,该API允许用户通过串口通信控制连接到托管服务器的计算机的电机驱动器 我的问题是: 我不太确定如何允许多个ApiController类实例与(可能是相同的)串行端口通信 我知道我需要使用SerialPort类,这不是我遇到的问题 我的想法: 我认为这必须通过所有不同控制器之间的共享类来完成,即我的SteeringWheelMain伸缩存储器控制器需要在串行端口上从/向特定设备读/写数据,而我的SteeringWheelTiltMotorC

我需要的是: 我正试图使用.NET在C#中公开一个API,该API允许用户通过串口通信控制连接到托管服务器的计算机的电机驱动器

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

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

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

任何帮助都将不胜感激


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

因此我定义了一个IMotorPort接口,其中包括发送和接收到马达的异步方法,并将在它的封装中建立SerialPort。MotorPort类将处理诸如转换字符串c之类的问题ommands(或者更好的DTO)到马达。此外,这将是插入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;
   }
}
公共接口IMotorPort
{
任务发送数据(字符串数据);
任务接收数据();
}
公共级汽车港:IMotorPort
{
受保护的串行端口{get;set;}
公共任务SendData(字符串数据)
{
//TODO:从串行端口发送
}
公共任务ReceiveData()
{
//TODO:从串行端口接收
}
}
公共类SteeringWheels主伸缩臂控制器
{
受保护的IMotorPort电机{get;set;}
公共方向盘主伸缩器拆卸控制器(IMORPORT电机)
{
这个。马达=马达;
}
}
公共级方向盘倾斜电机控制器
{
受保护的IMotorPort电机{get;set;}
公共方向盘倾斜电机控制器(IMORPORT电机)
{
这个。马达=马达;
}
}

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

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

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


  • 你的问题实际上并不适合SO。我可以告诉你,你会想使用这个类。对不起,应该更清楚,我知道如何实例化SerialPort通信,但我不确定如何将其设置为在触发API时(可能来自多个不同的控制器)可以执行写命令的方式即使你能做到这一点,你在并发方面也会遇到真正的问题。当两个人同时请求相同的操作时会发生什么情况?@DavidG在我的特殊情况下,这不会是一个问题。一次只有一个客户端与API交互。@BrianCorbin你还在寻找这个问题的答案吗?我可以证明今天晚些时候的ide one。谢谢,史努比!我已经在这个项目上工作了一周了,到目前为止我学到了很多东西。我决定使用一个静态服务,从我的API控制所有不同的设备,只需在后台线程中运行我需要发送给它们的任何命令。它似乎工作得非常好,结果就是even冷却器(我可以通过网络控制电机,非常酷)。谢谢你的提示,绝对有帮助!@BrianCorbin没问题,听起来像是一个很酷的项目。如果还有什么我可以帮助的,请告诉我。@BrianCorbin我越是考虑这个问题,我就越觉得你几乎可以使用类似WCF的东西来隔离一个API来通过串行总线控制电机……然后你就可以与该服务对话了通过IPC。查看如何使用WCF。