Java 標準庫不包含串口 API,工業級開發常用 RXTX(gnu.io 包)實現跨平台串口通信。本文詳述 RXTX 環境配置、核心服務類封裝、異常處理體系、AWT 圖形界面構建、數據解析協議與多線程監聽機制,附帶完整可運行項目代碼。
RXTXcomm.jar 加入 ClasspathrxtxSerial.dll / librxtxSerial.so)置於 java.library.path 目錄(如 JRE/bin)封裝端口掃描、打開/關閉、讀寫、監聽器註冊,統一拋出自定義異常便於上層處理。
// 掃描可用端口
public static ArrayList<String> findPort()
// 打開串口並設置參數(波特率、8數據位、1停止位、無校驗)
public static SerialPort openPort(String portName, int baudrate)
throws SerialPortParameterFailure, NotASerialPort, NoSuchPort, PortInUse
// 發送字節數組
public static void sendToPort(SerialPort port, byte[] data)
throws SendDataToSerialPortFailure, SerialPortOutputStreamCloseFailure
// 讀取可用數據(非阻塞)
public static byte[] readFromPort(SerialPort port)
throws ReadDataFromSerialPortFailure, SerialPortInputStreamCloseFailure
// 註冊事件監聽器(數據到達、通信中斷等)
public static void addListener(SerialPort port, SerialPortEventListener listener)
throws TooManyListeners
// 所有異常繼承 Exception,重寫 toString() 返回友好錯誤信息
public class SerialPortParameterFailure extends Exception {
@Override public String toString() { return "設置串口參數失敗!打開串口操作未完成!"; }
}
// 統一異常信息提取工具
public class ExceptionWriter {
public static String getErrorInfoFromException(Exception e) {
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
return "\r\n" + sw.toString() + "\r\n";
}
}
採用 Frame + Canvas 風格,update(Graphics) 實現離屏繪圖消除閃爍。
paint() 繪製標題、版本、閃爍提示「按 Enter 進入」RepaintThread 每 250ms 調用 repaint() 實現閃爍動畫KeyMonitor 監聽 Enter 鍵切換到數據監測界面Label 顯示:溫度、濕度、壓強、雨量、風速、風向Choice 下拉框動態掃描可用串口(每 30ms 刷新)private class SerialListener implements SerialPortEventListener {
@Override
public void serialEvent(SerialPortEvent event) {
switch (event.getEventType()) {
case SerialPortEvent.DATA_AVAILABLE: // 數據到達
byte[] data = SerialTool.readFromPort(serialPort);
String raw = new String(data);
// 協議:以 '*' 開頭,空格分隔 6 個字段
if (raw.startsWith("*")) {
String[] fields = raw.substring(1).split(" ");
// fields[0]=溫度, [1]=濕度, [2]=壓強, [3]=雨量, [4]=風速, [5]=風向
tem.setText(fields[0] + " ℃");
hum.setText(fields[1] + " %");
pa.setText(fields[2] + " hPa");
rain.setText(fields[3] + " mm");
win_sp.setText(fields[4] + " m/s");
win_dir.setText(fields[5] + " °");
}
break;
case SerialPortEvent.BI: // 通信中斷
JOptionPane.showMessageDialog(null, "與串口設備通信中斷");
break;
// 其他錯誤事件(OE/FE/PE/CD/CTS/DSR/RI/OUTPUT_BUFFER_EMPTY)忽略
}
}
}
| 技術點 | 實現要點 |
|---|---|
| 跨平台串口 | RXTX (gnu.io) 替代廢棄的 javax.comm,支持 32/64 位 Windows/Linux/macOS |
| 資源管理 | 單例 SerialTool 統一生命週期;finally 塊確保流關閉;窗口關閉時 closePort() |
| 異常處理 | 自定義異常層次 + 統一信息提取工具,GUI 中用 JOptionPane 友好提示 |
| 界面無閃爍 | 雙緩衝:createImage → 離屏繪圖 → drawImage 一次性貼圖 |
| 動態端口掃描 | 定時線程調用 findPort(),增量更新 Choice 選項(新增/移除) |
| 協議解析 | 自定義文本協議(*開頭、空格分隔),健壯性檢查(長度、下標越界) |
| 多線程協作 | 事件分發線程(EDT)更新UI;RXTX 內部線程回調 serialEvent;定時掃描線程 |

完整項目(含 RXTX 庫、Eclipse 工程):serialMonitor.rar
SerialPortService 接口,支持 Mock 測試。掌握 Java 串口通信全鏈路,能快速構建工業數據采集、設備監控、嵌入式聯調等上位機應用。