用java写一个串口上位机,波特率,数据位可设置,接收数据可选择格式,带时间戳
时间: 2024-03-24 16:37:43 浏览: 67
好的,下面是一个简单的Java串口上位机的示例代码,其中波特率、数据位、停止位、校验位和接收数据格式均可以设置,同时还带有时间戳:
```java
import gnu.io.*;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TooManyListenersException;
public class SerialPortTest implements SerialPortEventListener {
// 串口对象
private SerialPort serialPort;
// 输入流
private InputStream inputStream;
// 串口名称
private String portName = "COM1";
// 波特率
private int baudRate = 9600;
// 数据位
private int dataBits = SerialPort.DATABITS_8;
// 停止位
private int stopBits = SerialPort.STOPBITS_1;
// 校验位
private int parity = SerialPort.PARITY_NONE;
// 接收数据格式
private String dataFormat = "HEX";
// 时间格式
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
public SerialPortTest() {
// 初始化串口
init();
}
/**
* 初始化串口
*/
public void init() {
try {
// 获取当前系统的所有串口
CommPortIdentifier portIdentifier = null;
for (CommPortIdentifier commPortIdentifier : CommPortIdentifier.getPortIdentifiers()) {
if (commPortIdentifier.getPortType() == CommPortIdentifier.PORT_SERIAL && commPortIdentifier.getName().equals(portName)) {
portIdentifier = commPortIdentifier;
break;
}
}
if (portIdentifier == null) {
System.out.println("无法找到指定的串口!");
return;
}
// 打开串口
serialPort = (SerialPort) portIdentifier.open("SerialPortTest", 2000);
// 设置串口参数
serialPort.setSerialPortParams(baudRate, dataBits, stopBits, parity);
// 获取输入流
inputStream = serialPort.getInputStream();
// 添加监听器
serialPort.addEventListener(this);
// 设置监听器的阈值
serialPort.notifyOnDataAvailable(true);
} catch (PortInUseException | UnsupportedCommOperationException | IOException | TooManyListenersException e) {
e.printStackTrace();
}
}
/**
* 读取串口数据
*/
public void readData() {
try {
byte[] buffer = new byte[1024];
int len = inputStream.read(buffer);
if (len > 0) {
String data = "";
if (dataFormat.equals("HEX")) { // HEX格式
data = bytesToHex(buffer, len);
} else if (dataFormat.equals("ASCII")) { // ASCII格式
data = new String(buffer, 0, len);
}
System.out.println(sdf.format(new Date()) + " " + data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 字节数组转十六进制字符串
*
* @param bytes 字节数组
* @param len 长度
* @return 十六进制字符串
*/
public String bytesToHex(byte[] bytes, int len) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < len; i++) {
String hex = Integer.toHexString(bytes[i] & 0xFF);
if (hex.length() == 1) {
sb.append('0');
}
sb.append(hex.toUpperCase());
sb.append(' ');
}
return sb.toString();
}
/**
* 串口事件监听器
*
* @param event 事件
*/
@Override
public void serialEvent(SerialPortEvent event) {
if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
readData();
}
}
public static void main(String[] args) {
SerialPortTest serialPortTest = new SerialPortTest();
}
}
```
在代码中,首先使用`CommPortIdentifier.getPortIdentifiers()`方法获取当前系统的所有串口,然后根据名称找到指定的串口。接着,使用`serialPort.setSerialPortParams()`方法设置串口的波特率、数据位、停止位和校验位等参数。在串口打开后,通过`serialPort.getInputStream()`方法获取输入流。同时,使用`serialPort.addEventListener()`方法添加串口事件监听器,并设置阈值为`serialPort.notifyOnDataAvailable(true)`,表示只有当串口有数据可读时才触发事件。在事件监听器中,通过`readData()`方法读取串口数据,并根据接收数据格式进行解析和输出。最后,在`main()`方法中创建一个`SerialPortTest`对象,即可启动程序。
需要注意的是,以上代码只是一个简单的示例,实际应用中还需要根据具体需求进行进一步的自定义和配置。此外,还需要添加异常处理等代码,以确保程序的稳定性和健壮性。
阅读全文
相关推荐















