使用C#监控多个COM端口

时间:2015-03-17 08:47:43

标签: c# serial-port

背景:我们正在开发一个应用程序(或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);
        }
    }

我基本上想知道是否应该为包含控制台应用程序中的代码的每个端口创建一个类,或者我是否应该去老派并编写一个可以同时监视所有这些应用程序的巨型程序应用程序。

2 个答案:

答案 0 :(得分:1)

如果COM端口设备都相似,那么处理每个设备的实例检索数据的一个类似乎就是这样。如果需要单独的功能,您始终可以从基类继承。如果你顺着“编写一个巨大的程序性应用程序”,将来维护和修改会更加困难。

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

答案 1 :(得分:1)

DataReceived事件往往发生在SerialPort创建的后台线程上。

这意味着: 一个。您不需要自己创建多个线程来监控多个端口 湾您需要小心在事件处理程序中执行的操作,因为您可能不在应用程序的主线程上,例如,如果您直接与窗口交互,则可能会出现问题。然而,你的控制台东西会很好。