首先感谢所有能够帮助我进一步解决以下问题的人。
我正在串口发送一些文本给几个设备。由于已经存在的接口,我必须使用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);
}