如何在java/shell中释放javax.comm.portinUserException之后的串行端口
我有一个java应用程序,它从串行端口读取数据如何在java/shell中释放javax.comm.portinUserException之后的串行端口,java,linux,bash,serial-port,rxtx,Java,Linux,Bash,Serial Port,Rxtx,我有一个java应用程序,它从串行端口读取数据/dev/ttyUSB0。此应用程序在Linux上运行,使用RXTX库从java访问串行端口。 有时工作线程没有正确关闭串行端口,当启动一个新端口时,我会得到javax.comm.PortInUseException。 工作线程在调用close()方法时卡住。但我不能直接应用这种方法。 有没有办法强制Linux关闭端口?我可以调用外部进程并以root用户身份运行shell脚本。一旦操作系统关闭端口,我打算在java中处理适当的异常。 我无法重新启动计
/dev/ttyUSB0
。此应用程序在Linux上运行,使用RXTX库从java访问串行端口。有时工作线程没有正确关闭串行端口,当启动一个新端口时,我会得到
javax.comm.PortInUseException
。
工作线程在调用close()
方法时卡住。但我不能直接应用这种方法。有没有办法强制Linux关闭端口?我可以调用外部进程并以root用户身份运行shell脚本。一旦操作系统关闭端口,我打算在java中处理适当的异常。
我无法重新启动计算机。首先,您应该调试代码,并确保负责关闭设备节点的线程确实关闭了它;因为您谈论的是对不可共享硬件设备的访问,所以在RXTX连接中使用Holder模式可能会有所帮助
如果程序没有正确地关闭设备节点,唯一的选择就是杀死它。您可以使用
fuser/dev/ttyUSB0
查看哪个进程将其打开,然后kill
该PID。这不需要root权限,只需要以拥有要终止的进程的用户的身份进行访问。几个月前,我在工作中确实遇到了这个问题(至少看起来很像)。我花了很多时间(大约一个星期)在上面。我查看了本机代码,发现了问题(在RXTX库中)
我建议您实施与我相同的解决方案-正确管理线程和端口您不应该依赖PortinUseeException来检查端口是否已打开——这是针对“异常”情况的
只要确保你:
如果你想解决这个问题,而不是用正确的方法来解决,那么问题就出在本机应用程序中,因此你需要找到一种方法来“重启”它。在我的例子中,它都在一个OSGi框架内,所以我可以卸载包含本机应用程序的捆绑包,然后再次安装它。在您的情况下,可能需要重新启动整个Java进程使用它的进程就是他的Java进程。虽然杀死它可以解决问题,但我认为这不是一个合适的解决方案。当然,这是Java进程,但是如果进程不关闭端口,那么让端口未被绑定的唯一方法就是杀死有问题的进程。如果我调用close()呢在我的例子中,这是因为在同一个端口上调用open两次,但在第一次打开后却没有关闭它。如果不在已打开的端口上调用open,close()将不会永远阻塞。按照建议修复代码后,端口将不再被锁定。非常感谢。