我有一个从串行端口读取数据的 java 应用程序/dev/ttyUSB0
。此应用程序在 Linux 上运行,使用 RXTX 库从 java 访问串行端口。
有时串行端口没有被工作线程正确关闭,当启动一个新的时,我得到javax.comm.PortInUseException
. close()
工作线程在调用方法时卡住。这已经被问过了,但我不能直接应用那个黑客。
有没有办法强制 Linux 关闭端口?我可以调用外部进程并以 root 身份运行 shell 脚本。一旦端口被操作系统关闭,我打算在 java 中处理适当的异常。
我无法重新启动机器。
问问题
3271 次
2 回答
0
首先,您应该调试您的代码并确保负责关闭设备节点的线程确实关闭了它;由于您正在谈论访问不可共享的硬件设备,因此使用 Holder 模式进行 RXTX 连接可能会有所帮助。
如果程序没有正确关闭设备节点,唯一的选择就是杀死它。您可以使用fuser /dev/ttyUSB0
它来查看打开了哪个进程,然后查看kill
该 PID。这不需要root权限,只需以拥有要杀死的进程的用户身份访问即可。
于 2013-09-09T16:48:47.060 回答
0
几个月前,我实际上在工作中遇到了这个问题(至少看起来很像)。我花了很多时间(比如一周)。我查看了本机代码并发现了问题(它在 RXTX 库中)。
我将建议您实施与我相同的解决方案 -正确管理您的线程和端口!您不应该依赖 PortInUseException 来检查端口是否已打开 - 这是针对“特殊”情况的。
只要确保你:
- 始终在打开的端口上调用 close
- 永远不要在打开的端口上调用 open
如果您宁愿解决它而不是以正确的方式解决它 - 问题出在本机应用程序中,因此您需要找到一种方法来“重新启动”它。在我的例子中,它都在一个 OSGi 框架内,所以我可以卸载包含本机应用程序的包,然后重新安装它。在您的情况下,它可能需要重新启动整个 Java 进程
于 2013-09-09T16:49:48.617 回答