C# 多串口数据接收超时

C# 多串口数据接收超时,c#,.net,multithreading,serial-port,C#,.net,Multithreading,Serial Port,首先,感谢所有能够在以下问题上进一步帮助我的人 我正在通过串行端口向多个设备发送一些文本。由于已经存在接口,我必须使用DataReceived事件从串行端口读取响应。有些设备根本没有响应,因此我需要一个等待响应的超时时间 因此,对于单个设备,我创建一个SerialPort实例,向其DataReceived事件添加一个处理程序,发送文本并启动计时器。计时器回调运行自己的线程,我想在单独的线程中运行DataReceived处理程序 当响应出现在计时器滴答声之前时,需要停止计时器。当响应到来之前计时器

首先,感谢所有能够在以下问题上进一步帮助我的人

我正在通过串行端口向多个设备发送一些文本。由于已经存在接口,我必须使用DataReceived事件从串行端口读取响应。有些设备根本没有响应,因此我需要一个等待响应的超时时间

因此,对于单个设备,我创建一个SerialPort实例,向其DataReceived事件添加一个处理程序,发送文本并启动计时器。计时器回调运行自己的线程,我想在单独的线程中运行DataReceived处理程序

当响应出现在计时器滴答声之前时,需要停止计时器。当响应到来之前计时器发出滴答声时,不应处理延迟响应。因此,计时器和处理程序线程之间存在一些共享数据。如何进一步同步这两个线程

我还必须提到,我需要同时处理多个设备,这使得线程情况更加复杂

到目前为止,我处理单个设备的代码如下所示。如果有人能进一步指出我应该如何处理线程和同步它们,我将不胜感激

    private void OnNewDeviceConnected()
    {
        _timer = new Timer(OnTimeOut, null, Timeout.Infinite, Timeout.Infinite);
        _serialPort = new SerialPort("COM5", 9200, Parity.None, 8, StopBits.One);
        serialPort.DataReceived += (s, e) =>
        {
            HandleReceivedData();
        };

        serialPort.Write("Text");
        _timer.Change(1000, Timeout.Infinite);
    }

    private void OnTimeOut(object state)
    {
        // Do stuff on timeout
        _serialPort.Close();
        _timer.Change(Timeout.Infinite, Timeout.Infinite);
    }

    private void HandleReceivedData()
    {
        // Do stuff on received text
        _serialPort.Close();
        _timer.Change(Timeout.Infinite, Timeout.Infinite);
    }

“我还必须提到,我需要同时处理多个设备,这使得线程情况更加复杂”——这应该会让它更容易。每个设备都有单独的端口吗?是的,每个设备都有单独的端口。我想每个端口都有自己的处理线程。它乘以代码中创建的线程数。但是,不同端口的线程不需要彼此共享数据。SerialPort具有“ReadTimeout”属性。为什么要用定时器?尝试在一个类中封装与一个端口有关的所有内容,必要时在其中包含线程。使用一个设备/端口使其正常工作。然后,对于多个设备/端口,只需为每个端口创建一个实例。感谢您的建议。我没有直接使用SerialPort类。由于需要,我需要在SerialPort类周围使用一个包装器,它只公开DataReceived事件。。上帝保佑我们所有人免于不适当的工具/包装/子类:(