Java 最簡單使用 jSSC 傳送和接收序列埠的資料

之前寫了一篇 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 或以上使用的話很可能會出現如下錯誤:
    
#
# 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 官網的網域也失效沒有被註冊

留言