C# 使用C监控多个com端口#

C# 使用C监控多个com端口#,c#,serial-port,C#,Serial Port,背景:我们正在开发一个应用程序(或windows服务),它将侦听通过虚拟串行端口连接的各种设备的通信。每个设备的信息都将被手动捕获,因此我知道设备1将在COM5上,设备2将在COM6上,等等。每当设备传输数据时,我都需要捕获数据并写入其他地方(基本上是一个日志文件) 考虑到这一点,是否可以在单个线程上监视多个串行端口,还是应该为每个端口生成一个新线程(请记住,我确切地知道要监视哪些端口) 或者你们认为什么是好方法 我的工作原型代码如下所示(虽然只读取一个端口): 我基本上在想,是应该为控制台应用

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

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

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

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


我基本上在想,是应该为控制台应用程序中包含代码的每个端口创建一个类,还是应该走老路,编写一个巨大的过程应用程序,一次监视所有端口。

如果COM端口设备都相似,一个类来处理通过每个设备的一个实例来检索数据,这似乎是一种可行的方法。如果需要单独的功能,则始终可以从基类继承。如果你走上“编写一个巨大的程序应用程序”的道路,那么在将来维护和修改它将更加困难


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

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

这意味着: A.您不需要自己创建多个线程来监视多个端口
B您需要小心在事件处理程序中执行的操作,因为您可能不在应用程序的主线程上,例如,如果您直接与窗口交互,这可能是一个问题。不过,您的控制台内容将很好。

它将进入日志文件或数据库,因此在这方面无需担心。如果遇到问题,我将发布一个新问题。我有一个问题,我需要记录哪个设备说了什么,我不认为SerialDataReceivedEventArgs可以告诉我通信来自哪个端口。这就是为什么我需要以其他方式跟踪它,例如生成一个新线程,或者更可能创建一个知道它正在侦听COM5(或其他)的类的新实例。因此,一个事件处理程序无法处理所有事件。除非我误解了你的最后一行。如果你为每个端口创建一个实例,它将有自己的事件处理程序,所以它们都应该独立工作。您需要考虑如果从多个线程写入列表或文件(读取有关操作线程安全)会发生什么,因为这些类型的错误很难识别。请看,我误解了您所说的。谢谢你的意见。我想这可能就是我想要的答案。
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);
        }
    }