java 串口工具jSerialComm示例详解

 更新时间:2023年06月19日 08:56:49   作者:方大帝的博客  
这篇文章主要介绍了java 串口工具jSerialComm,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

由于项目之前用的串口工具RXTX只支持到jdk1.8 然后项目目前用到的jdk是13的 所以在网上找了一下 找到了这个jSerialComm 目前使用是支持13及1.8的 没做其它jdk版本测试

引入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() {
        // 获得当前所有可用串口
        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);
    }

到此这篇关于java串口工具jSerialComm的文章就介绍到这了,更多相关java串口jSerialComm内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 实战范例之校园二手市场系统的实现

    Java 实战范例之校园二手市场系统的实现

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+SSM+mysql+maven+tomcat实现一个校园二手市场系统,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • RabbitMQ消息队列之持久化机制详解

    RabbitMQ消息队列之持久化机制详解

    这篇文章主要介绍了RabbitMQ消息队列之持久化机制详解,持久化,即将原本存在于内存中的数据写入到磁盘上永久保存数据,防止服务宕机时内存数据的丢失,Rabbitmq 的持久化分为队列持久化、消息持久化和交换器持久化,需要的朋友可以参考下
    2023-08-08
  • springboot整合vue项目(小试牛刀)

    springboot整合vue项目(小试牛刀)

    这篇文章主要介绍了springboot整合vue项目(小试牛刀),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • 详解SpringBoot同时可以处理多少请求

    详解SpringBoot同时可以处理多少请求

    在日常操作中,相信很多人在SpringBoot能同时处理多少请求问题上存在疑惑,本文就来详细的介绍一下,感兴趣的可以了解一下
    2024-06-06
  • Java保留两位小数的实现方法

    Java保留两位小数的实现方法

    这篇文章主要介绍了 Java保留两位小数的实现方法的相关资料,需要的朋友可以参考下
    2017-06-06
  • java实战之桌球小游戏

    java实战之桌球小游戏

    这篇文章主要为大家详细介绍了java实战之桌球小游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Java编程复用类代码详解

    Java编程复用类代码详解

    这篇文章主要介绍了Java编程复用类代码详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Java享元设计模式优化对象创建提高性能和效率

    Java享元设计模式优化对象创建提高性能和效率

    Java享元设计模式通过共享可重用的对象,减少了系统中对象的数量,优化了对象的创建和管理,提高了性能和效率。它是一种经典的设计模式,适用于需要处理大量相似对象的应用程序
    2023-04-04
  • Spring Boot在Web应用中基于JdbcRealm安全验证过程

    Spring Boot在Web应用中基于JdbcRealm安全验证过程

    这篇文章主要为大家介绍了Spring Boot在Web应用中基于JdbcRealm安全验证过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪<BR>
    2023-02-02
  • Java synchronized轻量级锁的核心原理详解

    Java synchronized轻量级锁的核心原理详解

    这篇文章主要为大家详细介绍了Java synchronized轻量级锁的核心原理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03

最新评论