java 串口工具jSerialComm


由於項目之前用的串口工具RXTX只支持到jdk1.8 然后項目目前用到的jdk是13的 所以在網上找了一下 找到了這個 jSerialComm 目前使用是支持13及1.8的 沒做其它jdk版本測試

引入jar包,github地址:http://fazecast.github.io/jSerialComm/

        <!--http://fazecast.github.io/jSerialComm/-->
        <!--串口連接工具-->
        <dependency>
            <groupId>com.fazecast</groupId>
            <artifactId>jSerialComm</artifactId>
            <version>[2.0.0,3.0.0)</version>
        </dependency>

連接工具api文檔地址:com.fazecast.jSerialComm (jSerialComm 2.9.0 API)

串口操作:

package com.jinfu.core;

import com.fazecast.jSerialComm.SerialPort;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
public class SerialPortManager {
    //查找所有可用端口
    public static List<String> findPorts() {
        // 獲得當前所有可用串口
        SerialPort[] serialPorts = SerialPort.getCommPorts();
        List<String> portNameList = new ArrayList<String>();
        // 將可用串口名添加到List並返回該List
        for(SerialPort serialPort:serialPorts) {
            portNameList.add(serialPort.getSystemPortName());
        }
        //去重
        portNameList = portNameList.stream().distinct().collect(Collectors.toList());
        return portNameList;
    }

    /**
     * 打開串口
     *
     * @param portName  端口名稱
     * @param baudRate  波特率
     * @return 串口對象
     */
    public static SerialPort openPort(String portName, Integer baudRate) {
        SerialPort serialPort = SerialPort.getCommPort(portName);
        if (baudRate != null) {
            serialPort.setBaudRate(baudRate);
        }
        if (!serialPort.isOpen()) {
       //開啟串口 serialPort.openPort(
1000); }else{ return serialPort; } // 設置一下串口的波特率等參數 // 數據位:8 // 停止位:1 // 校驗位:None serialPort.setFlowControl(SerialPort.FLOW_CONTROL_DISABLED); serialPort.setComPortParameters(baudRate, 8, SerialPort.ONE_STOP_BIT, SerialPort.NO_PARITY); serialPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_BLOCKING | SerialPort.TIMEOUT_WRITE_BLOCKING, 1000, 1000); return serialPort; } /** * 關閉串口 * @param serialPort 待關閉的串口對象 */ public static void closePort(SerialPort serialPort) { if (serialPort != null && serialPort.isOpen()){ serialPort.closePort(); } } /** * 往串口發送數據 * @param serialPort 串口對象 * @param content 待發送數據 */ public static void sendToPort(SerialPort serialPort,byte[] content) { if (!serialPort.isOpen()) { return; } serialPort.writeBytes(content, content.length); } /** * 從串口讀取數據 * @param serialPort 當前已建立連接的SerialPort對象 * @return 讀取到的數據 */ public static byte[] readFromPort(SerialPort serialPort) { byte[] reslutData = null; try { if (!serialPort.isOpen()){return null;}; int i=0; while (serialPort.bytesAvailable() > 0 && i++ < 5) Thread.sleep(20); byte[] readBuffer = new byte[serialPort.bytesAvailable()]; int numRead = serialPort.readBytes(readBuffer, readBuffer.length); if (numRead > 0) { reslutData = readBuffer; } } catch (InterruptedException e) { e.printStackTrace(); } return reslutData; } /** * 添加監聽器 * @param serialPort 串口對象 * @param listener 串口存在有效數據監聽 */ public static void addListener(SerialPort serialPort, DataAvailableListener listener) { try { // 給串口添加監聽器 serialPort.addDataListener(new SerialPortListener(listener)); } catch (Exception e) { e.printStackTrace(); } } }

當前串口工具是自帶一個監聽的方法SerialPortDataListener

目前是寫了一個回調來監聽串口工具的監聽方法 這樣做 是為了混淆 混淆后 串口工具自帶的監聽方法無法被其它地方調用 

監聽:

import com.fazecast.jSerialComm.SerialPort;
import com.fazecast.jSerialComm.SerialPortDataListener;
import com.fazecast.jSerialComm.SerialPortEvent;
import lombok.extern.slf4j.Slf4j;

/**
 * 串口監聽
 */
@Slf4j
public class SerialPortListener implements SerialPortDataListener {

    private DataAvailableListener mDataAvailableListener;

    public SerialPortListener(DataAvailableListener mDataAvailableListener) {
        this.mDataAvailableListener = mDataAvailableListener;
    }

    @Override
    public int getListeningEvents() {
     //必須是return這個才會開啟串口工具的監聽
return SerialPort.LISTENING_EVENT_DATA_AVAILABLE; } public void serialEvent(SerialPortEvent serialPortEvent) { if (mDataAvailableListener != null) { mDataAvailableListener.dataAvailable(); } } }

  /**
     * 串口存在有效數據監聽
     */
    public interface DataAvailableListener {
        /**
         * 串口存在有效數據
         */
        void dataAvailable();
    }
 

 

 調用示例:

 /** 
     * @throws PortInUseException   串口已經被占用
     */
    public static void main(String[] args) throws PortInUseException {//打開串口,返回一個串口對象 參數:串口號 波特率
        SerialPort serialPort = SerialPortManager.openPort("COM1", 10000);
        //給當前串口對象設置監聽器
        SerialPortManager.addListener(serialPort, new DataAvailableListener() {
            @Override
            public void dataAvailable() {
                //當前監聽器監聽到的串口返回數據 back
                byte[] back = SerialPortManager.readFromPort(serialPort);
            }
        });
        //當前向串口發送的數據(模擬假數據)
        byte[] content = new byte[10];
        //向當前串口發送數據
        SerialPortManager.sendToPort(serialPort,content);
    }
當前項目只針對一個設備 所以監聽也是做的針對一個串口對象 
目前有個小問題 當串口已經開啟后 在去開啟串口會提示串口開啟失敗 同時之前開啟的串口無法再次開啟除非關閉后才能再次開啟 目前做的一個小處理就是在開啟的時候先將當前連接上串口關閉 然后再重新開啟


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM