串口通信的基础概念
串口通信是一种广泛使用的设备间数据传输方式,通过串行接口(如COM口)实现数据的逐位传输,Java本身不直接提供串口通信API,但可以通过第三方库(如RXTX、jSerialComm等)实现,本文以jSerialComm为例,介绍如何在Java中实现串口通信,包括环境搭建、串口配置、数据收发及异常处理等关键步骤。

开发环境准备
在开始开发前,需完成以下准备工作:
- 依赖库引入:下载jSerialComm库的JAR文件(或通过Maven/Gradle依赖管理),将其添加到项目的类路径中,Maven依赖示例:
<dependency> <groupId>com.fazecast</groupId> <artifactId>jSerialComm</artifactId> <version>2.9.3</version> </dependency> - 硬件检查:确认目标设备已正确连接到计算机的串口(如Windows的COM3、Linux的/dev/ttyUSB0),并通过设备管理器或
ls /dev/tty*命令验证串口是否存在。
串口通信的核心实现步骤
获取可用串口列表
首先通过SerialPort.getCommPorts()方法获取系统中所有可用串口,并遍历打印串口名称、描述信息等,便于后续选择目标串口:
import com.fazecast.jSerialComm.*;
public class SerialPortExample {
public static void main(String[] args) {
SerialPort[] commPorts = SerialPort.getCommPorts();
System.out.println("可用串口列表:");
for (SerialPort port : commPorts) {
System.out.println("端口名:" + port.getSystemPortName()
+ " | 描述:" + port.getDescriptivePortName());
}
}
}
打开并配置串口
确定目标串口后,通过SerialPort.openPort()方法打开串口,并配置通信参数(波特率、数据位、停止位、校验位等),以波特率115200、8位数据位、1位停止位、无校验为例:

SerialPort serialPort = SerialPort.getCommPort("COM3");
if (serialPort.openPort()) {
System.out.println("串口打开成功");
// 配置串口参数
serialPort.setBaudRate(115200);
serialPort.setDataBits(8);
serialPort.setStopBits(1);
serialPort.setParity(SerialPort.NO_PARITY);
// 设置读取超时时间(毫秒)
serialPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_BLOCKING, 1000, 0);
} else {
System.err.println("串口打开失败");
return;
}
发送数据
串口配置完成后,可通过writeBytes()方法向串口发送字节数据,发送字符串”Hello Serial”:
String sendData = "Hello Serial";
byte[] bytes = sendData.getBytes();
int bytesWritten = serialPort.writeBytes(bytes, bytes.length);
if (bytesWritten == bytes.length) {
System.out.println("数据发送成功:" + sendData);
} else {
System.err.println("数据发送失败");
}
接收数据
通过readBytes()方法读取串口缓冲区中的数据,结合线程或事件监听可实现实时数据接收:
byte[] readBuffer = new byte[1024];
int bytesRead = serialPort.readBytes(readBuffer, readBuffer.length);
if (bytesRead > 0) {
String receivedData = new String(readBuffer, 0, bytesRead);
System.out.println("接收数据:" + receivedData);
} else {
System.out.println("无数据可读");
}
若需持续监听串口数据,可使用SerialPort.addDataListener()注册数据监听器:

serialPort.addDataListener(new SerialPortDataListener() {
@Override
public int getListeningEvents() { return SerialPort.LISTENING_EVENT_DATA_AVAILABLE; }
@Override
public void serialEvent(SerialPortEvent event) {
if (event.getEventType() != SerialPort.LISTENING_EVENT_DATA_AVAILABLE) return;
byte[] buffer = new byte[serialPort.bytesAvailable()];
int bytesRead = serialPort.readBytes(buffer, buffer.length);
System.out.println("实时接收:" + new String(buffer, 0, bytesRead));
}
});
关闭串口
通信完成后,需调用closePort()方法关闭串口,释放系统资源:
serialPort.closePort();
System.out.println("串口已关闭");
异常处理与最佳实践
- 异常处理:串口通信中需处理
PortNotFoundException(串口不存在)、PortInUseException(串口被占用)、SerialPortTimeoutException(读取超时)等异常,确保程序健壮性。 - 资源释放:务必在程序退出前关闭串口,避免资源泄漏,可通过
try-finally或try-with-resources(需实现AutoCloseable)确保资源释放。 - 参数匹配:通信双方需保持波特率、数据位、停止位、校验位一致,否则数据传输可能出错。
- 数据校验:对于关键数据,建议添加校验机制(如CRC、校验和),确保数据传输的准确性。
通过jSerialComm库,Java可以高效实现串口通信功能,核心步骤包括获取串口、配置参数、数据收发及资源管理,实际开发中,需结合具体硬件需求调整通信参数,并注重异常处理和数据校验,以提高系统的稳定性和可靠性,掌握串口通信技术,可广泛应用于工业控制、嵌入式设备、传感器数据采集等领域。




















