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

Java 串口全雙工通訊框架:基於 JavaComm API 的嵌入式系統集成實戰

     編輯:Java 相關知識

嵌入式系統與主控系統間的全雙工串口通訊是工業自動化、儀器儀表、智能設備的核心需求。本文提供一個開箱即用的 Java 串口通訊類庫,封裝了 JavaComm API 的複雜細節,通過生產者-消費者模式實現非阻塞收發,包含串口初始化、緩衝區管理、讀取線程、應用接口四大模塊,附帶完整測試例程與部署指南。

架構設計:四大核心組件

SerialBean:應用層門面,提供 open/read/write/close 統一接口
SerialBuffer:線程安全環形緩衝區,解耦讀寫速度差異
ReadSerial:守護線程,持續輪詢串口輸入流填充緩衝區
SerialExample:演示業務邏輯:讀取指定長度數據 → 處理 → 回覆確認

核心代碼實現

1. SerialBean:應用入口與生命周期管理


public class SerialBean {
    private static String portName;
    private CommPortIdentifier portId;
    private SerialPort serialPort;
    private static OutputStream out;
    private static InputStream in;
    private SerialBuffer buffer;
    private ReadSerial readerThread;

    public SerialBean(int portID) { portName = "COM" + portID; }

    public int initialize() {
        try {
            portId = CommPortIdentifier.getPortIdentifier(portName);
            serialPort = (SerialPort) portId.open("Serial_Communication", 2000);
            
            in = serialPort.getInputStream();
            out = serialPort.getOutputStream();
            
            // 9600, 8, 1, None - 標準工業默認配置
            serialPort.setSerialPortParams(9600,
                SerialPort.DATABITS_8,
                SerialPort.STOPBITS_1,
                SerialPort.PARITY_NONE);
            
            // 啟動讀取線程
            buffer = new SerialBuffer();
            readerThread = new ReadSerial(buffer, in);
            readerThread.start();
            return 1; // 成功
        } catch (Exception e) {
            return -1; // 失敗
        }
    }

    public String readPort(int length) {
        return buffer.getMsg(length); // 阻塞直到足夠數據
    }

    public void writePort(String msg) {
        try {
            for (char c : msg.toCharArray()) out.write(c);
        } catch (IOException ignored) {}
    }

    public void closePort() {
        readerThread.stop(); // 注意:stop() 已棄用,生產環境建議用中斷標誌
        serialPort.close();
    }
}

2. SerialBuffer:線程安全緩衝區


public class SerialBuffer {
    private String content = "";
    private int lengthNeeded = 1;
    private boolean available = false;

    // 讀取指定長度(阻塞等待)
    public synchronized String getMsg(int length) {
        lengthNeeded = length;
        notifyAll();
        while (lengthNeeded > content.length()) {
            available = false;
            try { wait(); } catch (InterruptedException ignored) {}
        }
        String msg = content.substring(0, lengthNeeded);
        content = content.substring(lengthNeeded);
        lengthNeeded = 1;
        notifyAll();
        return msg;
    }

    // 寫入單字符(喚醒等待讀取線程)
    public synchronized void putChar(int c) {
        content += (char) c;
        if (lengthNeeded <= content.length()) available = true;
        notifyAll();
    }
}

3. ReadSerial:守護讀取線程


public class ReadSerial extends Thread {
    private SerialBuffer buffer;
    private InputStream port;

    public ReadSerial(SerialBuffer buffer, InputStream port) {
        this.buffer = buffer;
        this.port = port;
    }

    @Override
    public void run() {
        try {
            while (true) {
                int c = port.read(); // 阻塞讀取
                if (c != -1) buffer.putChar(c);
            }
        } catch (IOException ignored) {} // 串口關閉觸發異常退出
    }
}

部署與測試指南

環境準備

  1. 下載 Java Communications API (javax.comm) 並安裝至 JDK/JRE
  2. Windows: 放置 `win32com.dll` 至 `jre/bin`,`comm.jar` 至 `jre/lib/ext`,`javax.comm.properties` 至 `jre/lib`
  3. Linux: 配置 `/var/lock` 目錄權限,載入 RXTX 替代實現

硬件測試方案

例程驗證邏輯


public class SerialExample {
    public static void main(String[] args) {
        SerialBean sb = new SerialBean(1); // COM1
        sb.initialize();
        for (int i = 5; i <= 10; i++) {
            String msg = sb.readPort(i);       // 讀取 i 字節
            sb.writePort("Reply: " + msg);     // 回覆確認
        }
        sb.closePort();
    }
}

生產環境強化建議

  1. 線程安全退出:替換 `Thread.stop()` 為 `volatile boolean running` 標誌位優雅關閉
  2. 協議幀解析:在 SerialBuffer 層增加幀同步(如 STX/ETX、長度前綴、CRC 校驗)
  3. 流控支持:添加 RTS/CTS 硬件流控或 XON/XOFF 軟件流控配置選項
  4. 異步通知:引入 Listener 模式,數據到達時回調業務處理器,避免業務輪詢
  5. 跨平台適配:抽象 SerialPort 接口,Windows 用 JavaComm,Linux 用 RXTX/jSerialComm
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案硬件連接軟件配置
單機回環RS-232 交叉線連接 COM1-COM2COM1 運行 SerialExample,COM2 運行超級終端
雙機通訊RS-232 直連線連接兩機 COM1一端運行例程,一端運行超級終端