Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java/shell中释放javax.comm.portinUserException之后的串行端口_Java_Linux_Bash_Serial Port_Rxtx - Fatal编程技术网

如何在java/shell中释放javax.comm.portinUserException之后的串行端口

如何在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中处理适当的异常。 我无法重新启动计

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

我无法重新启动计算机。

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


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

几个月前,我在工作中确实遇到了这个问题(至少看起来很像)。我花了很多时间(大约一个星期)在上面。我查看了本机代码,发现了问题(在RXTX库中)

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

只要确保你:

  • 始终在打开的端口上调用close
  • 切勿在打开的端口上调用open

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

    使用它的进程就是他的Java进程。虽然杀死它可以解决问题,但我认为这不是一个合适的解决方案。当然,这是Java进程,但是如果进程不关闭端口,那么让端口未被绑定的唯一方法就是杀死有问题的进程。如果我调用close()呢在我的例子中,这是因为在同一个端口上调用open两次,但在第一次打开后却没有关闭它。如果不在已打开的端口上调用open,close()将不会永远阻塞。按照建议修复代码后,端口将不再被锁定。非常感谢。