使用JAVA写一个串口的收发接口带串口解码转换和测试
时间: 2023-06-17 11:02:26 浏览: 192
好的,下面是一个简单的Java串口收发接口代码,包括串口解码转换和测试:
```java
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
public class SerialPortTest implements SerialPortEventListener {
private static final int BAUD_RATE = 9600; // 串口波特率
private static final int DATA_BITS = SerialPort.DATABITS_8; // 数据位
private static final int STOP_BITS = SerialPort.STOPBITS_1; // 停止位
private static final int PARITY = SerialPort.PARITY_NONE; // 校验位
private InputStream inputStream; // 输入流
private OutputStream outputStream; // 输出流
private SerialPort serialPort; // 串口对象
private boolean isOpened = false; // 串口是否打开
public SerialPortTest() {
super();
}
public void open(String portName) {
try {
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
serialPort = (SerialPort) portIdentifier.open(this.getClass().getName(), 2000);
serialPort.setSerialPortParams(BAUD_RATE, DATA_BITS, STOP_BITS, PARITY);
inputStream = serialPort.getInputStream();
outputStream = serialPort.getOutputStream();
serialPort.addEventListener(this);
serialPort.notifyOnDataAvailable(true);
isOpened = true;
} catch (NoSuchPortException | PortInUseException | IOException | gnu.io.UnsupportedCommOperationException e) {
e.printStackTrace();
}
}
public void close() {
if (isOpened) {
try {
serialPort.removeEventListener();
serialPort.close();
inputStream.close();
outputStream.close();
isOpened = false;
} catch (IOException e) {
e.printStackTrace();
}
}
}
public boolean isOpened() {
return isOpened;
}
public void sendData(String data) {
try {
outputStream.write(data.getBytes(StandardCharsets.UTF_8));
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
public List<String> receiveData() {
List<String> dataList = new ArrayList<>();
try {
int available = inputStream.available();
byte[] buffer = new byte[available];
if (available > 0) {
inputStream.read(buffer);
dataList.add(new String(buffer, StandardCharsets.UTF_8));
}
} catch (IOException e) {
e.printStackTrace();
}
return dataList;
}
@Override
public void serialEvent(SerialPortEvent event) {
if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
List<String> dataList = receiveData();
for (String data : dataList) {
System.out.println("Received data: " + data);
}
}
}
public static void main(String[] args) {
SerialPortTest serialPortTest = new SerialPortTest();
serialPortTest.open("COM1"); // 打开串口
if (serialPortTest.isOpened()) {
serialPortTest.sendData("Hello World!"); // 发送数据
}
serialPortTest.close(); // 关闭串口
}
}
```
上面的代码使用了RXTXcomm库,需要将对应的jar包导入项目中。
使用时,先调用`open`方法打开指定的串口,然后就可以调用`sendData`方法发送数据,`receiveData`方法可以接收数据,`serialEvent`方法监听串口事件,当有数据可用时会自动调用此方法。
可以根据需要对串口解码进行修改,例如将上面的解码方式改为16进制:`dataList.add(Integer.toHexString(buffer[i] & 0xFF));`。
测试时,在`main`方法中调用`open`方法打开串口,然后可以调用`sendData`方法发送数据,最后调用`close`方法关闭串口。
阅读全文