有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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


共 (2) 个答案

  1. # 1 楼答案

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

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

  2. # 2 楼答案

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

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

    只要确保你:

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

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