最近有个小任务,就是把下位机发送过来的数据实时显示到label上,一直没有头绪,
后来看到了这篇博文,链接:
不如也开个线程,实时的取数据;
下面的是通过com口接收数据的代码,因为没有用到发送的部分,所以注释掉了;
com3,波特率9600
import java.io.IOException;
import java.io.InputStream;
//import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.TooManyListenersException;
import gnu.io.CommPort;
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 final class textRxTx {
/**
* @param args
*/
public static void main(String[] args) {
//获得系统端口列表
getSystemPort();
//开启端口COM3,波特率9600
final SerialPort serialPort = openSerialPort("COM3",9600);
//启动一个线程每2s向串口发送数据,发送1000次hello
/* new Thread(new Runnable() {
@Override
public void run() {
int i = 1;
while(i<1000) {
String s = "hello";
byte[] bytes = s.getBytes();
textRxTx.sendData(serialPort, bytes);//发送数据
i++;
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();*/
//设置串口的listener
textRxTx.setListenerToSerialPort(serialPort, new SerialPortEventListener() {
@Override
public void serialEvent(SerialPortEvent arg0) {
if(arg0.getEventType() == SerialPortEvent.DATA_AVAILABLE) {//数据通知
byte[] bytes = textRxTx.readData(serialPort);
System.out.println("收到的数据长度:"+bytes.length);
System.out.println("收到的数据:"+new String(bytes));
}
}
});
// closeSerialPort(serialPort);
}
/**
* 获得系统可用的端口名称列表
* @return 可用端口名称列表
*/
@SuppressWarnings("unchecked")
public static List<String> getSystemPort(){
List<String> systemPorts = new ArrayList<>();
//获得系统可用的端口
Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers();
while(portList.hasMoreElements()) {
String portName = portList.nextElement().getName();//获得端口的名字
systemPorts.add(portName);
}
System.out.println("系统可用端口列表:"+systemPorts);
return systemPorts;
}
/**
* 开启串口
* @param serialPortName 串口名称
* @param baudRate 波特率
* @return 串口对象
*/
public static SerialPort openSerialPort(String serialPortName,int baudRate) {
try {
//通过端口名称得到端口
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(serialPortName);
//打开端口,(自定义名字,打开超时时间)
CommPort commPort = portIdentifier.open(serialPortName, 2222);
//判断是不是串口
if (commPort instanceof SerialPort) {
SerialPort serialPort = (SerialPort) commPort;
//设置串口参数(波特率,数据位8,停止位1,校验位无)
serialPort.setSerialPortParams(baudRate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
System.out.println("开启串口成功,串口名称:"+serialPortName);
return serialPort;
}
else {
//是其他类型的端口
throw new NoSuchPortException();
}
} catch (NoSuchPortException e) {
e.printStackTrace();
} catch (PortInUseException e) {
e.printStackTrace();
} catch (UnsupportedCommOperationException e) {
e.printStackTrace();
}
return null;
}
/**
* 关闭串口
* @param serialPort 要关闭的串口对象
*/
public static void closeSerialPort(SerialPort serialPort) {
if(serialPort != null) {
serialPort.close();
System.out.println("关闭了串口:"+serialPort.getName());
serialPort = null;
}
}
/**
* 向串口发送数据
* @param serialPort 串口对象
* @param data 发送的数据
*//*
public static void sendData(SerialPort serialPort, byte[] data) {
OutputStream os = null;
try {
os = serialPort.getOutputStream();//获得串口的输出流
os.write(data);
os.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (os != null) {
os.close();
os = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}*/
/**
* 从串口读取数据
* @param serialPort 要读取的串口
* @return 读取的数据
*/
public static byte[] readData(SerialPort serialPort) {
InputStream is = null;
byte[] bytes = null;
try {
is = serialPort.getInputStream();//获得串口的输入流
int bufflenth = is.available();//获得数据长度
while (bufflenth != 0) {
bytes = new byte[bufflenth];//初始化byte数组
is.read(bytes);
bufflenth = is.available();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
is = null;
}
} catch(IOException e) {
e.printStackTrace();
}
}
return bytes;
}
/**
* 给串口设置监听
* @param serialPort
* @param listener
*/
public static void setListenerToSerialPort(SerialPort serialPort, SerialPortEventListener listener) {
try {
//给串口添加事件监听
serialPort.addEventListener(listener);
} catch (TooManyListenersException e) {
e.printStackTrace();
}
serialPort.notifyOnDataAvailable(true);//串口有数据监听
serialPort.notifyOnBreakInterrupt(true);//中断事件监听
}
}