首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 串口通信實戰:基於 RXTX 庫的圖形化上位機開發完整指南

     編輯:Java 綜合教學

Java 串口通信實戰:基於 RXTX 庫的圖形化上位機開發完整指南

Java 標準庫不包含串口 API,工業級開發常用 RXTX(gnu.io 包)實現跨平台串口通信。本文詳述 RXTX 環境配置、核心服務類封裝、異常處理體系、AWT 圖形界面構建、數據解析協議與多線程監聽機制,附帶完整可運行項目代碼。

一、環境準備

  1. 下載 RXTX:官網 或 32位 / 64位
  2. 解壓後將 RXTXcomm.jar 加入 Classpath
  3. 將對應平台的動態庫(rxtxSerial.dll / librxtxSerial.so)置於 java.library.path 目錄(如 JRE/bin)

二、核心服務類:SerialTool(單例模式)

封裝端口掃描、打開/關閉、讀寫、監聽器註冊,統一拋出自定義異常便於上層處理。

關鍵方法

// 掃描可用端口
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";
    }
}

三、圖形界面:雙緩衝 AWT 實現

採用 Frame + Canvas 風格,update(Graphics) 實現離屏繪圖消除閃爍。

主界面:Client(歡迎頁)

  • paint() 繪製標題、版本、閃爍提示「按 Enter 進入」
  • RepaintThread 每 250ms 調用 repaint() 實現閃爍動畫
  • KeyMonitor 監聽 Enter 鍵切換到數據監測界面

監測界面:DataView(儀表盤)

  • 六個 Label 顯示:溫度、濕度、壓強、雨量、風速、風向
  • Choice 下拉框動態掃描可用串口(每 30ms 刷新)
  • 波特率下拉框:1200~115200
  • 「打開串口」按鈕觸發連接與監聽註冊

四、串口事件監聽與數據解析

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

八、擴展建議

  1. 升級為 jSerialComm:純 Java 實現,無需原生庫,部署更簡單。
  2. 協議升級:採用二進制幀(幀頭/長度/命令/數據/校驗)提高可靠性。
  3. 架構分層:提取 SerialPortService 接口,支持 Mock 測試。
  4. UI 現代化:遷移至 JavaFX/Web 界面,分離通信邏輯與視圖。

掌握 Java 串口通信全鏈路,能快速構建工業數據采集、設備監控、嵌入式聯調等上位機應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved