我有以下例程,该例程是访问Windows中运行的usb4java API中的串行端口的入口点。任何想法可能是错误的。
import javax.comm.*
public class SimpleJSComRead
public static void main(String[] args) {
portList = CommPortIdentifier.getPortIdentifiers();
if (portList.nextElement()==null) System.out.println("Is Null");
}
}
当前,这可以使用jssc使用。我可以通过此界面读取有效数据。
import jssc.SerialPort;
import jssc.SerialPortException;
public class SimpleJSComRead {
public static void main(String[] args) {
SerialPort serialPort = new SerialPort("COM6");
try { serialPort.openPort();
} catch (SerialPortException e) {
e.printStackTrace();
}
if (serialPort.isOpened()) System.out.println("opened successfully");
try { serialPort.closePort();
} catch (SerialPortException e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:0)
我找到了javax.comm库未完全implemented或supported的事实。 我发现奇怪的是,对于Java而言,像从串行端口读取这样的基本功能应该是一项艰巨的任务,而托管Web应用程序却被各种API复制。我希望Python和C ++能够很好地支持串行通讯,因为科学界越来越多地使用串行通讯。
我发现的另一个解决方案是利用RXTX API ... one和two。该过程涉及下载压缩发行版,并将dll和jar提取到FileSystem上的某个库站点。然后声明对Jar文件的依赖关系。例如在Gradle
compile files( 'C:/..path../lib/jars/RXTXcomm.jar')
。
并设置dll库路径并加载dll
System.setProperty("java.library.path", "C:/..path../lib/dlls_x64")
System.loadLibrary("rxtxSerial")
最后,串行API不在javax.comm包中,而是在gnu.io包中。
import gnu.io.CommPortIdentifier
import io.FileMgr
//this one is based on RXTX and dlls are in library (gnu.io)
fun main(args: Array<String>) {
FileMgr.setDllLibraryPath("C:/..path../lib/dlls_x64")
System.loadLibrary("rxtxSerial")
val portList = CommPortIdentifier.getPortIdentifiers()
while (portList.hasMoreElements()) {
val x = portList.nextElement() as CommPortIdentifier
println("Port Name = " + x.name + ", type= " + x.portType)
}
if (portList.nextElement() == null) println("Is Null")
}
fun setDllLibraryPath(resourceStr: String) {
try {
System.setProperty("java.library.path", resourceStr)
//System.setProperty("java.library.path", "/lib/x64");//for example
val fieldSysPath =
ClassLoader::class.java.getDeclaredField("sys_paths")
fieldSysPath.isAccessible = true
fieldSysPath.set(null, null)//next time path is accessed, the new path
will be imported
} catch (ex: Exception) {
ex.printStackTrace()
throw RuntimeException(ex)
}
}