欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java?串口工具jSerialComm示例詳解

 更新時(shí)間:2023年06月19日 08:56:49   作者:方大帝的博客  
這篇文章主要介紹了java?串口工具jSerialComm,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

由于項(xiàng)目之前用的串口工具RXTX只支持到j(luò)dk1.8 然后項(xiàng)目目前用到的jdk是13的 所以在網(wǎng)上找了一下 找到了這個(gè)jSerialComm 目前使用是支持13及1.8的 沒(méi)做其它jdk版本測(cè)試

引入jar包,github地址: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() {
        // 獲得當(dāng)前所有可用串口
        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 串口對(duì)象
     */
    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;
        }
        // 設(shè)置一下串口的波特率等參數(shù)
        // 數(shù)據(jù)位:8
        // 停止位:1
        // 校驗(yàn)位: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;
    }
    /**
     * 關(guān)閉串口
     * @param serialPort    待關(guān)閉的串口對(duì)象
     */
    public static void closePort(SerialPort serialPort) {
        if (serialPort != null && serialPort.isOpen()){
            serialPort.closePort();
        }
    }
    /**
     * 往串口發(fā)送數(shù)據(jù)
     * @param serialPort    串口對(duì)象
     * @param content       待發(fā)送數(shù)據(jù)
     */
    public static void sendToPort(SerialPort serialPort,byte[] content) {
        if (!serialPort.isOpen()) {
            return;
        }
        serialPort.writeBytes(content, content.length);
    }
    /**
     * 從串口讀取數(shù)據(jù)
     * @param serialPort    當(dāng)前已建立連接的SerialPort對(duì)象
     * @return 讀取到的數(shù)據(jù)
     */
    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;
    }
    /**
     * 添加監(jiān)聽器
     * @param serialPort    串口對(duì)象
     * @param listener  串口存在有效數(shù)據(jù)監(jiān)聽
     */
    public static void addListener(SerialPort serialPort, DataAvailableListener listener) {
        try {
            // 給串口添加監(jiān)聽器
            serialPort.addDataListener(new SerialPortListener(listener));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

當(dāng)前串口工具是自帶一個(gè)監(jiān)聽的方法SerialPortDataListener

目前是寫了一個(gè)回調(diào)來(lái)監(jiān)聽串口工具的監(jiān)聽方法 這樣做 是為了混淆 混淆后 串口工具自帶的監(jiān)聽方法無(wú)法被其它地方調(diào)用

監(jiān)聽:

import com.fazecast.jSerialComm.SerialPort;
import com.fazecast.jSerialComm.SerialPortDataListener;
import com.fazecast.jSerialComm.SerialPortEvent;
import lombok.extern.slf4j.Slf4j;
/**
 * 串口監(jiān)聽
 */
@Slf4j
public class SerialPortListener implements SerialPortDataListener {
    private DataAvailableListener mDataAvailableListener;
    public SerialPortListener(DataAvailableListener mDataAvailableListener) {
        this.mDataAvailableListener = mDataAvailableListener;
    }
    @Override
    public int getListeningEvents() {     //必須是return這個(gè)才會(huì)開啟串口工具的監(jiān)聽
        return SerialPort.LISTENING_EVENT_DATA_AVAILABLE;
    }
    public void serialEvent(SerialPortEvent serialPortEvent) {
        if (mDataAvailableListener != null) {
            mDataAvailableListener.dataAvailable();
        }
    }
}
  /**
     * 串口存在有效數(shù)據(jù)監(jiān)聽
     */
    public interface DataAvailableListener {
        /**
         * 串口存在有效數(shù)據(jù)
         */
        void dataAvailable();
    }

調(diào)用示例:

/** 
     * @throws PortInUseException   串口已經(jīng)被占用
     */
    public static void main(String[] args) throws PortInUseException {//打開串口,返回一個(gè)串口對(duì)象 參數(shù):串口號(hào) 波特率
        SerialPort serialPort = SerialPortManager.openPort("COM1", 10000);
        //給當(dāng)前串口對(duì)象設(shè)置監(jiān)聽器
        SerialPortManager.addListener(serialPort, new DataAvailableListener() {
            @Override
            public void dataAvailable() {
                //當(dāng)前監(jiān)聽器監(jiān)聽到的串口返回?cái)?shù)據(jù) back
                byte[] back = SerialPortManager.readFromPort(serialPort);
            }
        });
        //當(dāng)前向串口發(fā)送的數(shù)據(jù)(模擬假數(shù)據(jù))
        byte[] content = new byte[10];
        //向當(dāng)前串口發(fā)送數(shù)據(jù)
        SerialPortManager.sendToPort(serialPort,content);
    }

到此這篇關(guān)于java串口工具jSerialComm的文章就介紹到這了,更多相關(guān)java串口jSerialComm內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java 生成隨機(jī)單據(jù)號(hào)的實(shí)現(xiàn)示例

    Java 生成隨機(jī)單據(jù)號(hào)的實(shí)現(xiàn)示例

    本文主要介紹了Java 生成隨機(jī)單據(jù)號(hào)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • 最簡(jiǎn)單的MyBatis Plus的多表聯(lián)接、分頁(yè)查詢實(shí)現(xiàn)方法

    最簡(jiǎn)單的MyBatis Plus的多表聯(lián)接、分頁(yè)查詢實(shí)現(xiàn)方法

    這篇文章主要介紹了最簡(jiǎn)單的MyBatis Plus的多表聯(lián)接、分頁(yè)查詢實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java自定義注解實(shí)現(xiàn)Redis自動(dòng)緩存的方法

    Java自定義注解實(shí)現(xiàn)Redis自動(dòng)緩存的方法

    本篇文章主要介紹了Java自定義注解實(shí)現(xiàn)Redis自動(dòng)緩存的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • SpringBoot獲取ApplicationContext的3種方式

    SpringBoot獲取ApplicationContext的3種方式

    這篇文章主要為大家詳細(xì)介紹了SpringBoot獲取ApplicationContext的3種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • SpringBoot整合MyBatis的代碼詳解

    SpringBoot整合MyBatis的代碼詳解

    這篇文章主要介紹了SpringBoot整合MyBatis筆記記錄,大家需要注意在整合mybatis之前我們需要相對(duì)應(yīng)的導(dǎo)入相關(guān)依賴,首先需要在java的目錄和resources下創(chuàng)建mapper文件夾,對(duì)SpringBoot整合MyBatis的詳細(xì)過(guò)程感興趣的朋友一起看看吧
    2022-05-05
  • List集合對(duì)象中按照不同屬性大小排序的實(shí)例

    List集合對(duì)象中按照不同屬性大小排序的實(shí)例

    下面小編就為大家?guī)?lái)一篇List集合對(duì)象中按照不同屬性大小排序的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • SpringBoot+MySQL+Jpa實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的增刪改查和分頁(yè)詳解

    SpringBoot+MySQL+Jpa實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的增刪改查和分頁(yè)詳解

    這篇文章主要介紹了SpringBoot+MySQL+Jpa實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的增刪改查和分頁(yè)詳解,需要的朋友可以參考下
    2020-02-02
  • 詳解JAVA調(diào)用WCF服務(wù)的示例代碼

    詳解JAVA調(diào)用WCF服務(wù)的示例代碼

    這篇文章主要介紹了詳解JAVA調(diào)用WCF服務(wù)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • java開發(fā)命名規(guī)范總結(jié)

    java開發(fā)命名規(guī)范總結(jié)

    包名的書寫規(guī)范 (Package)推薦使用公司或機(jī)構(gòu)的頂級(jí)域名為包名的前綴,目的是保證各公司/機(jī)構(gòu)內(nèi)所使用的包名的唯一性。包名全部為小寫字母,且具有實(shí)際的區(qū)分意義
    2013-10-10
  • 深度deepin安裝以及jdk、tomcat、Nginx安裝教程

    深度deepin安裝以及jdk、tomcat、Nginx安裝教程

    這篇文章主要給大家介紹了關(guān)于深度deepin安裝以及jdk、tomcat、Nginx安裝的相關(guān)資料,按照文中介紹的方法可以輕松的實(shí)現(xiàn)安裝,對(duì)大家的工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01

最新評(píng)論