RS232(EIA-RS-232C)是最經典的全雙工串行協議,廣泛應用於 Modem、儀器儀表、工業控制、PDA、USB 轉串口設備等。常見接口:DB9(9針)、DB25(25針)。
| 信號 | DB9 針腳 | DB25 針腳 | 說明 |
| RXD (接收) | 2 | 3 | 交叉連接對方 TXD |
| TXD (發送) | 3 | 2 | 交叉連接對方 RXD |
| GND (地) | 5 | 7 | 直連 |
注意:部分設備內部已交換 2/3 針,若通訊失敗嘗試直連 2-2、3-3。
Java Communications API 環境搭建
JDK 不內置串口包,需獨立下載 comm.jar(Windows/Solaris 官方版,Linux 參考 RXTX):
comm.jar → <JRE_HOME>/lib/ext
win32com.dll → 應用運行目錄(user.dir)或 <JRE_HOME>/bin
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 更現代)作為替代方案。
- 上一篇文章: Java Web 開發必備:Cookie 完整操作指南與跨瀏覽器坑點避雷
- 下一篇文章: Struts Logic 標簽庫完全指南:條件判斷、迭代與消息控制
Copyright ©
程式碼之家 All Rights Reserved