2

我有一个从串行端口读取数据的 java 应用程序/dev/ttyUSB0。此应用程序在 Linux 上运行,使用 RXTX 库从 java 访问串行端口。
有时串行端口没有被工作线程正确关闭,当启动一个新的时,我得到javax.comm.PortInUseException. close()工作线程在调用方法时卡住。这已经被问过了,但我不能直接应用那个黑客。
有没有办法强制 Linux 关闭端口?我可以调用外部进程并以 root 身份运行 shell 脚本。一旦端口被操作系统关闭,我打算在 java 中处理适当的异常。
我无法重新启动机器。

4

2 回答 2

0

首先,您应该调试您的代码并确保负责关闭设备节点的线程确实关闭了它;由于您正在谈论访问不可共享的硬件设备,因此使用 Holder 模式进行 RXTX 连接可能会有所帮助。

如果程序没有正确关闭设备节点,唯一的选择就是杀死它。您可以使用fuser /dev/ttyUSB0它来查看打开了哪个进程,然后查看kill该 PID。这不需要root权限,只需以拥有要杀死的进程的用户身份访问即可。

于 2013-09-09T16:48:47.060 回答
0

几个月前,我实际上在工作中遇到了这个问题(至少看起来很像)。我花了很多时间(比如一周)。我查看了本机代码并发现了问题(它在 RXTX 库中)。

我将建议您实施与我相同的解决方案 -正确管理您的线程和端口!您不应该依赖 PortInUseException 来检查端口是否已打开 - 这是针对“特殊”情况的。

只要确保你:

  1. 始终在打开的端口上调用 close
  2. 永远不要在打开的端口上调用 open

如果您宁愿解决它而不是以正确的方式解决它 - 问题出在本机应用程序中,因此您需要找到一种方法来“重新启动”它。在我的例子中,它都在一个 OSGi 框架内,所以我可以卸载包含本机应用程序的包,然后重新安装它。在您的情况下,它可能需要重新启动整个 Java 进程

于 2013-09-09T16:49:48.617 回答