[英]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);
}
}
我基本上想知道是否应该为每个包含控制台应用程序中代码的端口创建一个类,还是应该老套写一个可以同时监视所有程序的大型程序应用程序。
如果COM端口设备都是相似的,那么用一种类来处理每个设备的实例来检索其数据似乎是一种方法。 如果需要单独的功能,则始终可以从基类继承。 如果您放弃“编写大型程序应用程序”的狂热,将来将很难维护和修改。
对于多线程,您使用的事件处理程序应允许读取多个端口,而不会影响程序中的其他操作。 可以将它们视为自己的线程,它们之间的操作需要作为跨线程操作(例如更改表单属性)来处理。
无论如何,DataReceived事件往往发生在SerialPort创建的后台线程上。
这意味着: 您不需要自己创建多个线程来监视多个端口b。 您需要小心在事件处理程序中执行的操作,因为您可能不在应用程序的主线程上,例如,如果直接与窗口进行交互,则可能会出现问题。 但是,您的控制台资料会很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.