環境準備
- 下載 RXTX 檔案:
RXTXcomm.jar、rxtxSerial.dll(Windows)或 librxtxSerial.so(Linux)。
- 放置位置:
RXTXcomm.jar → %JAVA_HOME%/jre/lib/ext/ 並加入專案依賴。
rxtxSerial.dll → %JAVA_HOME%/jre/bin/。
核心類設計
1. CommPort 參數實體
public class CommPort {
private String commPortName; // COM1, COM2...
private String ownerName; // 應用名稱
private String baudRate; // 9600, 115200...
private String dataBit; // 8
private String partityBit; // 0=無, 1=奇, 2=偶
private String stopBit; // 1, 1.5, 2
// getter/setter 略
}
2. CommPortManager 管理器
public class CommPortManager {
private CommPort commPort;
private SerialPort serialPort;
private InputStream in; private OutputStream out;
private BufferedReader bufReader; private BufferedWriter bufWriter;
private DataInputStream dataIn; private DataOutputStream dataOut;
private boolean isUse;
public CommPortManager(CommPort port) { this.commPort = port; }
public void open() throws Exception {
CommPortIdentifier id = CommPortIdentifier.getPortIdentifier(commPort.getCommPortName());
serialPort = (SerialPort) id.open(commPort.getOwnerName(), 5000);
in = serialPort.getInputStream();
out = serialPort.getOutputStream();
bufReader = new BufferedReader(new InputStreamReader(in, "Unicode"));
bufWriter = new BufferedWriter(new OutputStreamWriter(out));
dataIn = new DataInputStream(in);
dataOut = new DataOutputStream(out);
serialPort.setSerialPortParams(
Integer.parseInt(commPort.getBaudRate()),
Integer.parseInt(commPort.getDataBit()),
Integer.parseInt(commPort.getStopBit()),
Integer.parseInt(commPort.getPartityBit()));
}
public boolean commPortEnable() {
Enumeration<CommPortIdentifier> en = CommPortIdentifier.getPortIdentifiers();
while (en.hasMoreElements()) {
CommPortIdentifier pid = en.nextElement();
if (pid.getPortType() == CommPortIdentifier.PORT_SERIAL
&& pid.getName().equalsIgnoreCase(commPort.getCommPortName()))
return true;
}
return false;
}
// getter/setter 略
}
使用流程
- 構建
CommPort 參數。
- 實例化
CommPortManager,調用 open()。
- 透過
dataOut.write() 發送指令,dataIn.read() 接收回應。
- 用完調用
serialPort.close() 釋放資源。
常見坑
- DLL/so 架構不匹配(32/64 位)導致
UnsatisfiedLinkError。
- 串口被佔用拋
PortInUseException,需檢查其他程式。
- 編碼不一致(Unicode/UTF-8/GBK)導致亂碼,雙端協商統一。