使用 C# 监视多个 com 端口

Monitoring multiple com ports using C#

背景:我们正在开发一个应用程序(或 windows 服务),它将侦听来自通过虚拟串行端口连接的各种设备的通信。每个设备的信息都将被手动捕获,所以我知道设备 1 在 COM5 上,设备 2 在 COM6 上,等等。每当设备传输数据时,我都需要捕获它并写入其他地方(基本上是一个日志文件)。

考虑到这一点,是否可以在单个线程上监视多个串行端口,或者我应该为每个端口生成一个新线程(请记住,我确切地知道要监视哪些端口)?

或者你们认为什么是好的方法?

我的工作原型代码如下所示(虽然只读取一个端口):

class Program
    {
        public static void Main()
        {
            SerialPort mySerialPort = new SerialPort("COM5");

            mySerialPort.BaudRate = 9600;
            mySerialPort.Parity = Parity.None;
            mySerialPort.StopBits = StopBits.One;
            mySerialPort.DataBits = 8;
            mySerialPort.Handshake = Handshake.None;

            mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

            mySerialPort.Open();

            Console.WriteLine("Press any key to continue...");
            Console.WriteLine();
            Console.ReadKey();

            mySerialPort.Close();
        }

        private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort sp = (SerialPort)sender;
            string indata = sp.ReadExisting();
            Console.WriteLine(indata);
            Debug.Print("Data Received:");
            Debug.Print(indata);
        }
    }

我基本上想知道我是否应该为包含控制台应用程序中的代码的每个端口创建一个 class,或者我是否应该去老派写一个巨大的程序应用程序来监视所有他们马上。

如果 COM 端口设备都相似,一个 class 来处理通过每个设备的实例检索它们的数据似乎是可行的方法。如果需要单独的功能,您始终可以从基础 class 继承。如果再走'writing a giant procedural app'的老路,以后维护和修改会困难很多。

至于多线程,您使用的事件处理程序应该允许在不影响程序中其他操作的情况下读取多个端口。它们可以被认为是自己的线程,它们之间的操作需要作为跨线程操作来处理(例如更改表单属性)。

无论如何,DataReceived 事件往往发生在由 SerialPort 创建的后台线程上。

这意味着: 一种。不需要自己创建多个线程来监听多个端口 b.您需要小心您在事件处理程序中所做的事情,因为您可能不在应用程序的主线程上,这可能是一个问题,例如,如果您直接与 window 交互。但是,您的控制台内容会很好。