Java发送串口指令的完整指南
串口通信在工业控制、嵌入式系统、设备调试等领域有着广泛应用,Java作为一种跨平台语言,通过第三方库可以轻松实现串口指令的发送,本文将详细介绍Java发送串口指令的流程、所需工具、代码实现及注意事项,帮助开发者快速掌握这一技术。

开发环境准备
在开始编写代码前,需要准备好以下开发环境:
- Java开发工具:推荐使用JDK 8或更高版本,确保支持Java标准库和第三方依赖。
- 串口通信库:Java本身不直接支持串口操作,需借助第三方库,常用的有:
- RXTX:老牌串口通信库,支持跨平台,但已停止更新。
- jSerialComm:推荐使用,轻量级、活跃维护,支持Windows、Linux、macOS。
- JavaComm:早期Sun官方库,现已废弃,不推荐新项目使用。
本文以jSerialComm为例,展示实现步骤,首先需下载该库的JAR文件,并将其添加到项目的类路径中,若使用Maven,可在pom.xml中添加依赖:
<dependency>
<groupId>com.fazecast</groupId>
<artifactId>jSerialComm</artifactId>
<version>2.9.3</version>
</dependency>
串口通信基础流程
Java发送串口指令的核心流程可分为以下步骤:
- 获取可用串口列表:枚举系统中所有可用串口,确认目标设备连接的串口号。
- 打开串口:配置串口参数(波特率、数据位、停止位、校验位等),并建立连接。
- 发送数据:将指令转换为字节数组,通过串口输出流写入设备。
- 关闭串口:通信完成后,释放串口资源,避免占用。
代码实现详解
获取可用串口列表
通过jSerialComm的getCommPorts()方法可获取所有串口信息,示例代码如下:
import com.fazecast.jSerialComm.*;
public class SerialPortExample {
public static void main(String[] args) {
SerialPort[] ports = SerialPort.getCommPorts();
System.out.println("可用串口列表:");
for (SerialPort port : ports) {
System.out.println(port.getSystemPortName() + " - " + port.getDescriptivePortName());
}
}
}
运行后控制台将输出类似COM3 - USB Serial Device (COM3)的信息,开发者可根据设备名称选择目标串口。
打开并配置串口
确定串口号后,需打开串口并设置通信参数,以下是关键配置项:

- 波特率(Baud Rate):如9600、115200等,需与设备端一致。
- 数据位(Data Bits):通常为8位。
- 停止位(Stop Bits):通常为1位。
- 校验位(Parity):无校验(None)、奇校验(Odd)、偶校验(Even)。
示例代码:
SerialPort serialPort = SerialPort.getCommPort("COM3");
serialPort.setBaudRate(9600);
serialPort.setDataBits(8);
serialPort.setStopBits(1);
serialPort.setParity(SerialPort.NO_PARITY);
if (serialPort.openPort()) {
System.out.println("串口打开成功");
} else {
System.err.println("串口打开失败");
return;
}
发送串口指令
串口指令通常为字节数组形式,可通过OutputStream写入数据,发送十六进制指令0x01 0x03 0x00 0x00 0x00 0x01 0x84 0x0A:
try {
byte[] command = {(byte) 0x01, (byte) 0x03, 0x00, 0x00, 0x00, 0x01, (byte) 0x84, (byte) 0x0A};
OutputStream outputStream = serialPort.getOutputStream();
outputStream.write(command);
outputStream.flush();
System.out.println("指令发送成功");
} catch (Exception e) {
e.printStackTrace();
}
若需发送字符串指令,可先转换为字节数组:
String instruction = "AT+CMD\r\n"; byte[] data = instruction.getBytes(); outputStream.write(data);
关闭串口
通信完成后,务必关闭串口并释放资源:
serialPort.closePort();
System.out.println("串口已关闭");
高级功能与注意事项
串口事件监听
jSerialComm支持通过事件监听器接收串口数据,监听串口接收事件:
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 numRead = serialPort.readBytes(buffer, buffer.length);
System.out.println("收到数据: " + bytesToHex(buffer));
}
private String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) { sb.append(String.format("%02X ", b)); }
return sb.toString();
}
});
异常处理
串口通信中需处理常见异常:

- 串口占用:检查串口是否被其他程序占用。
- 参数不匹配:确保波特率、数据位等与设备一致。
- 数据发送失败:检查设备是否就绪或指令格式是否正确。
跨平台兼容性
不同操作系统下串口名称可能不同:
- Windows:
COM1、COM2等。 - Linux:
/dev/ttyS0、/dev/ttyUSB0等。 - macOS:
/dev/cu.usbserial-XXXX等。
代码中需根据操作系统动态选择串口名称,提高兼容性。
通过jSerialComm库,Java可以高效实现串口指令的发送,开发者需掌握串口配置、数据转换、异常处理等关键技能,并结合实际需求优化代码逻辑,在实际应用中,建议结合日志记录和调试工具,确保通信的稳定性和可靠性,随着物联网和工业自动化的发展,串口通信技术仍将在Java生态中发挥重要作用。



















