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