如何在c#中从两个不同的应用程序访问串口

本文关键字:两个 应用程序 串口 访问 | 更新日期: 2023-09-27 18:03:13

我正在使用三个WCF服务,其中一个使用串行端口监视读卡器,该端口在用户刷卡时接收数据。然后将数据发送到另一个服务,该服务验证数据并调用其他服务为与该滑动端口关联的用户打开大门。

由于串行端口已经被第一个WCF服务打开并监视,因此其他服务无法访问该端口以发送命令打开门。当我试图通过创建一个单例类来解决这个问题时,我可以获得相同的对象,但状态没有维护,因为端口说它没有打开,但实际上它是通过第一个服务打开的。

我刚刚放置了我的端口类。如有任何意见或建议,请参考

public class Port : SerialPort
{     
    public Port(string port) : base(port)
    {
    }
    public static Port Instance
    {
        get { return Nested.myPort; }
    }
    class Nested
    {
        static Nested() { }
        internal static Port swipePort;
        public static Port myPort
        {
            get
            {
                if (swipePort == null)
                    swipePort = new Port("COM4");
                if (!swipePort.IsOpen)
                    swipePort.Open();
                return swipePort;
            }
        }
    }
}

如何在c#中从两个不同的应用程序访问串口

同一个端口不能打开两次。我建议一个WCF服务负责通过串行端口进行通信,其他服务与该服务通信。例如,使用客户端证书或其他身份验证方案,以便对服务的调用不会导致未经授权的"Open Door"请求。

上面的例子创建了一个端口的静态实例,但是静态实例只在同一个AppDomain的上下文中是"静态的"。根据您的托管模型,两个WCF服务可以位于不同的appdomain中。此外,对串行端口的读写不是线程安全的,因此以这种方式使用SerialPort会遇到问题。