之前寫了一篇 C# 最簡單使用 SerialPort 傳送和接收序列埠的資料,想說也順便來研究一下 Java 的版本。
本篇會使用到 jSSC (Java Simple Serial Connector) 套件,請先至 Github 上下載 jar 檔案(也可以使用 maven)
請注意,這裡的專案不是使用 scream3r/java-simple-serial-connector ,而是他的一個分支 java-native/jssc。原本的專案上次更新已經是 9 年前了,停留在 2.8.0 版本,如果在 windows 10 或以上使用的話很可能會出現如下錯誤:
感謝開源社群的貢獻!
建立連線、監聽、發送序列埠資料的完整程式碼
jSerialComm
rxtx
註: rxtx 這個 Github 專案好像不是原作者的,並且 www.rxtx.org 官網的網域也失效沒有被註冊
本篇會使用到 jSSC (Java Simple Serial Connector) 套件,請先至 Github 上下載 jar 檔案(也可以使用 maven)
請注意,這裡的專案不是使用 scream3r/java-simple-serial-connector ,而是他的一個分支 java-native/jssc。原本的專案上次更新已經是 9 年前了,停留在 2.8.0 版本,如果在 windows 10 或以上使用的話很可能會出現如下錯誤:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000007110b5db, pid=6116, tid=38436
#
# JRE version: OpenJDK Runtime Environment (18.0.2+9) (build 18.0.2+9-61)
# Java VM: OpenJDK 64-Bit Server VM (18.0.2+9-61, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, windows-amd64)
# Problematic frame:
# C [jSSC-2.8_x86_64.dll+0xb5db]
#
# No core dump will be written. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:\Users\ruyut\Documents\test\RuyutSerialReadExample\hs_err_pid6116.log
#
# If you would like to submit a bug report, please visit:
# https://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
Process finished with exit code 1
如果遇到上述問題,只要使用 java-native/jssc 分支的 2.9.4 版本或以上就不會遇到此錯誤。
感謝開源社群的貢獻!
jar 下載
開啟 Github 的發布頁面,點選最新版本的 jar 檔案,下載後放置到專案內 lib 後即可開始寫程式程式碼
讀取電腦上的序列埠
String[] portNames = SerialPortList.getPortNames();
for (String string : portNames) {
System.out.println(string);
}
建立連線、監聽、發送序列埠資料的完整程式碼
package com.ruyut;
import jssc.*;
public class RuyutExample {
public static void main(String[] args) {
SerialPort serialPort = new SerialPort("COM4");
try {
serialPort.openPort();
serialPort.setParams(
SerialPort.BAUDRATE_9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE
);
serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN | SerialPort.FLOWCONTROL_RTSCTS_OUT);
// 監聽
serialPort.addEventListener(serialPortEvent -> {
try {
String receivedData = serialPort.readString(serialPortEvent.getEventValue());
System.out.println(receivedData);
} catch (SerialPortException e) {
throw new RuntimeException(e);
}
});
// 傳送資料
serialPort.writeString("Hi, I'm Ruyut!");
} catch (SerialPortException e) {
System.err.println(e);
}
}
}
結語
是不是非常的簡單啊? 不過可惜 Java 原本提供的都不怎麼好用, 筆者在研究的時候也有看到其他可以讀取序列埠的第三方套件,如果有需要也可以參考看看:jSerialComm
rxtx
註: rxtx 這個 Github 專案好像不是原作者的,並且 www.rxtx.org 官網的網域也失效沒有被註冊
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com