[英]Java CommPortIdentifier.getPortIdentifiers() returns null Windows 7
我正在尝试从PC的串行端口读取数据,但我不断得到一组空端口。 我在stackoverflow,coderanch和oracle论坛上查找了许多其他问题,所有这些问题都提到需要在jre文件夹的特定目录中包含win32com.dll,comm.jar和javax.comm.properties。 。 完成所有这些操作后,我仍然得到一组空端口。 这是我的代码(几乎是从网上复制和粘贴的):
import java.io.*;
import java.util.*;
import javax.comm.*;
public class ReadWriteSerial implements SerialPortEventListener{
private Enumeration portList = null;
private CommPortIdentifier portId = null;
private String defaultPort = null;
private boolean portFound = false;
private int baudRate = 0;
private SerialPort serialPort = null;
private DataInputStream is = null;
private BufferedReader inStream;
/********************************
* Constructor for the base class
* @param defaultPort
* @param baudrate
*******************************/
public ReadWriteSerial(String defaultPort, int baudrate) throws NoSuchPortException{
this.defaultPort = defaultPort;
checkPorts(); // Call a method for checking ports on the System
}
/************************************
* This method checks the presence of
* ports on the System, in affirmative
* case initializes and configures it
* to receive data on the serial port
***********************************/
public void checkPorts() throws NoSuchPortException{
/***************************************
* Get a list of all ports on the system
**************************************/
// CommPortIdentifier d = CommPortIdentifier.getPortIdentifier("COM1");
portList =CommPortIdentifier.getPortIdentifiers();
System.out.println("List of all serial ports on this system:");
while(portList.hasMoreElements()){
portId = (CommPortIdentifier)portList.nextElement();
if(portId.getName().equals(defaultPort)){
portFound = true;
System.out.println("Port found on: " + defaultPort);
initialize(); // If Port found then initialize the port
}
}
if(!portFound){
System.out.println("No serial port found!!!");
}
}
public void initialize(){
/**********************
* Open the serial port
*********************/
try{
serialPort = (SerialPort)portId.open("Artificial Horizont", 2000);
} catch (PortInUseException ex){
System.err.println("Port already in use!");
}
// Get input stream
try{
is = new DataInputStream(serialPort.getInputStream());
} catch (IOException e){
System.err.println("Cannot open Input Stream " + e);
is = null;
}
try{
serialPort.setSerialPortParams(this.baudRate,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException ex){
System.err.println("Wrong settings for the serial port: " + ex.getMessage());
}
try{
serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
} catch (UnsupportedCommOperationException ex){
System.err.println("Check the flow control setting: " + ex.getMessage());
}
// Add an event Listener
try{
serialPort.addEventListener(this);
} catch (TooManyListenersException ev){
System.err.println("Too many Listeners! " + ev);
}
// Advise if data available to be read on the port
serialPort.notifyOnDataAvailable(true);
}
/**********************************
* Method from interface definition
* @param event
*********************************/
@Override
public void serialEvent(SerialPortEvent event){
inStream = new BufferedReader(new InputStreamReader(is), 5);
String rawInput = null;
switch(event.getEventType()){
case SerialPortEvent.BI:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.FE:
case SerialPortEvent.OE:
case SerialPortEvent.PE:
case SerialPortEvent.RI:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
case SerialPortEvent.DATA_AVAILABLE:
try {
while((rawInput = inStream.readLine()) != null){
System.out.println(rawInput);
/*
!!!!!!!!!!!!!!!!!!!!!!!!!!!!HERE I GET THE VALUE FROM THE SERIAL PORT AND THOSE MUST BE "VISIBLE" TO THE SUBPANEL CLASS IN ORDER AND RUN THE METHOD REPAINT!!!!!!!!!!!!!!!!!!!!!
*/
}
inStream.close();
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
break;
default:
break;
}
}
}
和我的主要班级:
public class RunComReader {
public static void main(String[] args) throws NoSuchPortException {
ReadWriteSerial reader = new ReadWriteSerial("COM1", 2000);
}
}
这些文件放在此目录的lib,bin和lib / ext文件夹中:
C:\Program Files (x86)\Java\jre1.8.0_31
我究竟做错了什么?
Java 8 不再支持 javax.com
lib。 您可以使用jssc
lib( https://code.google.com/p/java-simple-serial-connector/ )进行串行通信。
我正在使用JRE7(1.7.0),但仍然有此问题。 有趣的是,从eclipse中已安装的JRE(窗口/首选项/ Java /已安装的JRE)列表中删除了jdk后,解决了该问题(即使未选中它,并且jre7是活动的并被选中)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.