串口未关闭。我想发布COM端口......
以下是我的代码......
import java.io.*;
import java.util.*;
import gnu.io.*;
public class ReadCommPort implements SerialPortEventListener {
static CommPortIdentifier portId;
static Enumeration portList;
InputStream inputStream;
OutputStream outputStream;
public SerialPort serialPort;
List byteList = new ArrayList();
public static Message message = null;
public void readData() {
boolean portFound = false;
String defaultPort = "COM1";
portList = CommPortIdentifier.getPortIdentifiers();
while ( portList.hasMoreElements() ) {
portId = ( CommPortIdentifier )portList.nextElement();
if ( portId.getPortType() == CommPortIdentifier.PORT_SERIAL ) {
if ( portId.getName().equals( defaultPort ) ) {
System.out.println( "Found port: " + defaultPort );
portFound = true;
buildSerialPort();
}
}
}
if ( ! portFound ) {
System.out.println( "port " + defaultPort + " not found." );
}
}
public void buildSerialPort() {
try {
serialPort = (SerialPort) portId.open( "ReadCommPort", 1 );
inputStream = serialPort.getInputStream();
outputStream = serialPort.getOutputStream();
serialPort.addEventListener( this );
serialPort.notifyOnDataAvailable(true);
serialPort.setSerialPortParams( 2400, SerialPort.DATABITS_7, SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE );
}
catch ( Exception e ) {
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
public void serialEvent( SerialPortEvent event ) {
switch ( event.getEventType() ) {
case SerialPortEvent.BI:
System.out.println( "BI");
break;
case SerialPortEvent.OE:
System.out.println( "OE");
break;
case SerialPortEvent.FE:
System.out.println( "FE");
break;
case SerialPortEvent.PE:
System.out.println( "PE");
break;
case SerialPortEvent.CD:
System.out.println( "CD");
break;
case SerialPortEvent.CTS:
System.out.println( "CTS");
break;
case SerialPortEvent.DSR:
System.out.println( "DSR");
break;
case SerialPortEvent.RI:
System.out.println( "RI");
break;
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
System.out.println( "OUTPUT_BUFFER_EMPTY");
break;
case SerialPortEvent.DATA_AVAILABLE :
try {
int len = inputStream.available();
byte[] readBuffer = new byte[ len ];
// processing data code..
// close the port
// release all resources...
serialPort.removeEventListener();
try
{
serialPort.addEventListener( null );
}
catch (TooManyListenersException e)
{
e.printStackTrace();
}
inputStream.close();
outputStream.close();
serialPort.close();
}
catch ( IOException e )
{
e.printStackTrace();
}
break;
}
}
public static void main(String[] args) {
new ReadCommPort().readData();
}
}
答案 0 :(得分:2)
如果您使用的是RXTX-2.1版本,则通过调用removeEventListener();程序应该挂起。这是由于库中的本机代码。这可以通过运行这样的代码来避免,但对我个人而言,这并不是真的喜欢:
new Thread(){
@Override
public void run(){
serialPort.removeEventListener();
serialPort.close();
}
}.start();
如果你基本上使用RXTX,那么使用2.2版。以及尝试组件jSSC的提示 - http://code.google.com/p/java-simple-serial-connector/