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

Java 串口通訊開發指南:基於 Java Communications API 的 RS232 實戰

     編輯:Java 程式設計入門

串口通訊基礎知識

RS232(EIA-RS-232C)是最經典的全雙工串行協議,廣泛應用於 Modem、儀器儀表、工業控制、PDA、USB 轉串口設備等。常見接口:DB9(9針)、DB25(25針)。

三線制接線法(最通用)

注意:部分設備內部已交換 2/3 針,若通訊失敗嘗試直連 2-2、3-3。

Java Communications API 環境搭建

JDK 不內置串口包,需獨立下載 comm.jar(Windows/Solaris 官方版,Linux 參考 RXTX):

  1. comm.jar → <JRE_HOME>/lib/ext
  2. win32com.dll → 應用運行目錄(user.dir)或 <JRE_HOME>/bin
  3. javax.comm.properties → <JRE_HOME>/lib

驗證:運行 java -jar comm.jar 或編寫枚舉端口測試程序。

核心 API 體系

包 javax.comm 核心類/接口:

  • CommPortIdentifier:端口標識符,枚舉、打開、所有權管理
  • CommPort:端口抽象,提供 getInputStream()/getOutputStream()
  • SerialPort extends CommPort:串口專屬配置(波特率、數據位、停止位、校驗位、流控)
  • SerialPortEventListener:事件驅動監聽接口
  • 異常:NoSuchPortException、PortInUseException、UnsupportedCommOperationException

開發核心流程

1. 枚舉可用串口


Enumeration<CommPortIdentifier> ports = CommPortIdentifier.getPortIdentifiers();
while (ports.hasMoreElements()) {
    CommPortIdentifier pid = ports.nextElement();
    if (pid.getPortType() == CommPortIdentifier.PORT_SERIAL)
        System.out.println(pid.getName()); // 輸出 COM1, COM2 等
}

2. 打開並配置串口


CommPortIdentifier pid = CommPortIdentifier.getPortIdentifier("COM1");
SerialPort port = (SerialPort) pid.open("MyApp", 2000); // 2秒超時
port.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
InputStream in = port.getInputStream();
OutputStream out = port.getOutputStream();

3. 數據收發兩種模式

輪詢模式(需獨立線程)


new Thread(() -> {
    byte[] buffer = new byte[1024];
    while (!stopped) {
        int len = in.read(buffer);
        if (len > 0) processData(buffer, len);
    }
}).start();

避免阻塞主線程,配合 available() 非阻塞檢查或專用線程循環讀取。

事件驅動模式(推薦)


port.addEventListener(new SerialPortEventListener() {
    public void serialEvent(SerialPortEvent e) {
        if (e.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
            // 讀取數據
        }
    }
});
port.notifyOnDataAvailable(true);

由底層驅動觸發,CPU 佔用低,響應及時。

4. 關閉釋放資源


port.removeEventListener();
in.close(); out.close();
port.close(); // 必須調用 CommPort.close(),而非 Identifier

實戰建議

  • 通訊參數(波特率等)必須雙端一致
  • 定義應用層協議:幀頭/幀尾、長度、校驗和、命令字
  • 發送端:寫入 OutputStream 後 flush()
  • 接收端:處理粘包/半包,緩衝區拼接解析
  • 異常處理:端口被佔用、拔出設備、通訊超時重試
  • Linux 下優先使用 RXTX 或 jSerialComm 替代官方舊包

總結

Java Communications API 提供了標準、跨平台的串口訪問能力。掌握「枚舉→打開→配置→流/事件收發→關閉」標準流程,配合應用層協議設計,即可實現設備集成、儀器控制、工業數據采集等場景。現代項目建議考慮 jSerialComm(純 Java、無原生庫依賴、API 更現代)作為替代方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
信號DB9 針腳DB25 針腳說明
RXD (接收)23交叉連接對方 TXD
TXD (發送)32交叉連接對方 RXD
GND (地)57直連