C#多线程和串行通信

本文关键字:通信 多线程 | 更新日期: 2023-09-27 18:21:14

今天我遇到了一些奇怪的行为。我有一个使用SerialPort类访问的串行设备。主应用程序有一些计时器,每秒轮询一次设备以获取一些状态更新。在某一点上,我需要做一些耗时的工作,因此不需要阻塞我使用Backgroundworker的GUI。后台工作人员需要访问一次相同的串行设备。有时访问有效,有时不起作用。经典mutli-thread场景。因此,我尝试在向串行设备发送新命令的功能上使用Mutex。

对于串行设备,我把所有东西都放在自己的类中。在这个类中,我有一个sendCommand()函数,它将命令写入设备,并使用AutoResetEventOnDataReceived事件来等待答案。sendCommand函数会阻塞,直到收到应答或超时为止。然后,我在输入sendCommand时添加了Mutex,并在所有可能的出口上添加releaseMutex。仍然不起作用。

有更好的方法来处理这个问题吗?

谢谢,Tobias

C#多线程和串行通信

我有一个做同样事情的应用程序——我所做的是创建了一个串行访问类,每当我调用它时(从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读取命令。如果在超时时间内收到串行请求对象,线程将执行该对象;如果等待超时,线程将对串行设备进行轮询。