Rxtx开源包下载地址:http://mfizz.com/oss/rxtx-for-java
windows平台使用方法:
1、把rxtxParallel.dll、rxtxSerial.dll拷贝到:C:\WINDOWS\system32下。
2、如果是在开发的时候(JDK),需要把RXTXcomm.jar拷贝到..\jre…\lib\ext下;将rxtxParallel.dll、rxtxSerial.dll 拷贝到..\jre…\bin下;如:D:\Program Files\java\jre1.8.0_111\lib\ext
3、java,需要导入RXTXcomm.jar包
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.TooManyListenersException;
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;
public class SerialUtil implements SerialPortEventListener{
public int timeout = 6; // 超时时间
public String port = "COM1"; // 端口名称
public int dataBits = 8; // 数据位
public int stopBits = 1; // 停止位
public int parity = 0; // 奇偶校验
public int rate = 38400; // 波特率
private SerialPort serialPort;
boolean isOpen = false; // 端口状态:打开或关闭
// static byte[] openJoin12 = new byte[] { 0xFE, 0x03, 0x21, 0x30, 0xFF, 0xFC,
// 0x12, 0x03 }; // 开启 12S 允许加网指令
// static byte[] makeNet = new byte[] { 0xFE, 0x00, 0x21, 0x31, 0x10}; // 终端串口发送组网指令
public SerialUtil() {
listPortChoices();
//getPortStatus();
open();
sendData("hi");
sendData("");
//getPortStatus();
//close();
//getPortStatus();
}
public void getPortStatus() {
if(isOpen) {
System.out.println("端口已打开");
} else {
System.out.println("端口已关闭");
}
}
// 读取所有串口名字
public void listPortChoices() {
CommPortIdentifier portId;
Enumeration en = CommPortIdentifier.getPortIdentifiers();
while (en.hasMoreElements()) {
portId = (CommPortIdentifier) en.nextElement();
System.out.println("port: "+ portId.getName() + " : " + portId.getPortType());
// if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { // 只得到com串口
// System.out.println(portId.getName());
// }
}
}
// 打开串口
public void open() {
try {
CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier(port);
serialPort = (SerialPort) portId.open("controller", timeout);
//inputStream = serialPort.getInputStream();
serialPort.addEventListener(this);// 增加一个监听
serialPort.notifyOnDataAvailable(true);
serialPort.setSerialPortParams(rate, dataBits, stopBits, parity);
isOpen = true;
} catch (NoSuchPortException e) { // 端口不存在
e.printStackTrace();
} catch (PortInUseException e) { // 端口已经被占用
e.printStackTrace();
} catch (UnsupportedCommOperationException e) { // 端口操作命令不支持
e.printStackTrace();
} catch (TooManyListenersException e) { // 太多的监听者
e.printStackTrace();
}
}
// 关闭串口
public void close() {
if (isOpen) {
try {
serialPort.notifyOnDataAvailable(false);
serialPort.removeEventListener();
serialPort.close();
isOpen = false;
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 向端口发送数据
public void sendData(String data) {
if(isOpen) {
try {
OutputStream outputStream = serialPort.getOutputStream();
outputStream.write(data.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void serialEvent(SerialPortEvent event) {
switch (event.getEventType()) {
case SerialPortEvent.BI: // 10
case SerialPortEvent.OE: // 7
case SerialPortEvent.FE: // 9
case SerialPortEvent.PE: // 8
case SerialPortEvent.CD: // 6
case SerialPortEvent.CTS: // 3
case SerialPortEvent.DSR: // 4
case SerialPortEvent.RI: // 5
case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 2
break;
case SerialPortEvent.DATA_AVAILABLE: // 1
try {
// 多次读取,将所有数据读入
byte[] readBuffer = new byte[1000];
InputStream inputStream = serialPort.getInputStream();
while (inputStream.available() > 0) {
inputStream.read(readBuffer);
}
System.out.println(new String(readBuffer));
} catch (IOException e) {
e.printStackTrace();
}
break;
}
}
public static void main(String[] args) {
SerialUtil su = new SerialUtil();
}
}