0

今天我遇到了一些奇怪的行为。我有一个使用SerialPort该类访问的串行设备。主应用程序有一些计时器,每秒轮询一次设备以获取某些状态更新。在某些时候,我需要做一些耗时的工作,因此不要阻止我使用Backgroundworker. 后台工作者需要一次访问相同的串行设备。有时访问工作有时不工作。经典mutli-thread场景。所以我尝试在将新命令发送到串行设备的函数上使用互斥锁。

对于串行设备,我将所有内容放在它自己的类中。在这个类中,我有一个sendCommand()函数,它将命令写入设备并使用 aAutoResetEventOnDataReceivedEvent 来等待答案。函数 sendCommand 会阻塞,直到收到答案或发生超时。然后我Mutex在输入 sendCommand 和releaseMutex所有可能的退出时添加了 。还是不行。

有没有更好的方法来处理这个?

谢谢,托拜厄斯

4

2 回答 2

1

我有一个应用程序可以做同样的事情——我所做的是我创建了一个串行访问类,并且每当我调用它时(从 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来确保读取所有数据。

于 2013-07-05T15:04:04.420 回答
0

我通常做的是在循环中运行串行读/写线程,从 BlockingQueue 读取命令并进行定时等待。如果在超时时间内接收到串行请求对象,则线程执行它,如果等待超时,则线程执行对串行设备的轮询。

于 2013-07-05T18:48:06.643 回答