C#多线程和串行通信
本文关键字:通信 多线程 | 更新日期: 2023-09-27 18:21:14
今天我遇到了一些奇怪的行为。我有一个使用SerialPort
类访问的串行设备。主应用程序有一些计时器,每秒轮询一次设备以获取一些状态更新。在某一点上,我需要做一些耗时的工作,因此不需要阻塞我使用Backgroundworker
的GUI。后台工作人员需要访问一次相同的串行设备。有时访问有效,有时不起作用。经典mutli-thread
场景。因此,我尝试在向串行设备发送新命令的功能上使用Mutex。
对于串行设备,我把所有东西都放在自己的类中。在这个类中,我有一个sendCommand()
函数,它将命令写入设备,并使用AutoResetEvent
和OnDataReceived
事件来等待答案。sendCommand函数会阻塞,直到收到应答或超时为止。然后,我在输入sendCommand时添加了Mutex
,并在所有可能的出口上添加releaseMutex
。仍然不起作用。
有更好的方法来处理这个问题吗?
谢谢,Tobias
我有一个做同样事情的应用程序——我所做的是创建了一个串行访问类,每当我调用它时(从GUI或我的一个后台线程),我都会得到以下内容:
private void myFunction(SerialClass myserialobject) {
if (myserialobject == null)
return;
lock (myserialobject) {
// code accessing the serial object
// ...
// when finished, close the lock statement
}
}
我在主线程和任何其他需要访问的线程中都使用了这个。这是阻止,但我相信这是一个阻止声明。
此外,我没有为OnDataReceived
事件使用事件处理程序,而是让串行对象在任何写入后执行阻塞读取,这样可以防止在错误的上下文中接收任何数据。我不确定你的程序是如何设置的,但你可以考虑这样做。如果您知道在向端口写入时期望读取的字节数,则效果最佳;这样您就不必使用Sleep
来确保所有数据都已读取。
我通常做的是在循环中运行串行读/写线程,通过定时等待从BlockingQueue读取命令。如果在超时时间内收到串行请求对象,线程将执行该对象;如果等待超时,线程将对串行设备进行轮询。