[英]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.