0

从 Java 中的串行端口读取数据时,我遇到了一个奇怪的问题。

我必须通过工作正常的线程中的轮询方法从串行端口读取数据,但我有一个要求,我需要将数据写入串行端口并读回 ACK。向串口写入数据成功,但我无法读回数据。这里有两个读操作,一个在线程中,一个在主线程中。

收到串行写入数据后,我暂停了使用标志从串行端口读取数据的线程,并在写入完成后再次开始从串行端口读取数据,但我无法读取数据。我在写操作后禁用了读取串口并启用了在线程中读取串口的线程,这里我看到了来自串口的 ACK 数据。

任何人都可以提出这个串行读取操作出了什么问题吗?它不是缓冲的读/写操作。

4

2 回答 2

0

我强烈建议只使用一个专用线程来访问串行端口读取。最可靠的解决方案曾经是将所有接收到的数据铲到线程安全状态机的中断处理程序。尝试从多个线程读取串行端口会调用问题。串行端口 IO 不在乎您“暂停了线程”,数据可能已经被获取并由于上下文切换而丢失。

因此,只需继续阅读进来的内容,如果预期并获得 ACK,则通过信号量通知主线程。在一个肮脏的残酷简化的伪代码中:

主线程循环:

{
  serialReaderThread.isAckExpected = true
  sendWriteCommand();
  ackReceivedSemaphore.wait();
}

串行阅读器线程循环:

{
  readData();
  if( isAckExpected && data == ack ) {
    mainThread.ackReceivedSemaphore.notify();
    isAckExpected = false
  }
}

您需要isAckExpected在发送写入命令之前进行设置,因为如果您的串行对等点足够快,您可能会在您sendWriteCommand甚至返回之前得到响应。

于 2012-06-14T19:20:44.093 回答
0

您不应该有不同的线程尝试从串行端口读取。正确的架构是让单线程读取数据并通过多个队列将传入数据分发给感兴趣的客户端。

您将拥有一个“正常读取处理”线程,该线程由读取线程提供数据。当您需要执行 write/ack 序列时,执行 write/ack 的线程会临时将自己注册到读取线程并转移数据流。

您仍然必须处理任何数据交错处理(即在写入请求之后但在收到确认之前接收正常数据),但这取决于您的应用程序。

于 2012-06-14T19:09:34.303 回答