Java串口开发

news2025/1/13 7:40:04

网上搜索了关于java串口开发的资料,发现都不是特别的全,故写下一些心得以帮助其他人能快速上手java串口开发,如有错漏之处,敬请指正
串口开发会用到一个javax.comm和RXTXcomm库,,javax.comm库不支持64位操作系统。该库仅适用于32位操作系统,所以接下来主要介绍的还是RXTXcomm库进行的串口开发

资源下载

RXTXcomm有32位的,也有64位的包,我们大多用到的都是64而且jdk都是1.8版本的
链接: 下载地址
在这里插入图片描述
这里注意选择2.2版本的,这个版本是支持64位的操作系统

在这里插入图片描述
下载完以后我们可以发现,目录下有一个jar文件,和对各个操作系统不同支持的系统文件,这里我们如果是在windwos64位的情况下只有的话,只需要用到RXTXcomm.jar和win64里面的dll文件即可

环境配置

下载完成以后,接下来我们需要将这个jar文件和lib文件引入到项目中

  1. 将rxtxSerial.dll文件放到JAVA_HOME\jre\bin下
  2. 将RXTXComm分别放在项目的lib目录下,和jre的ext目录下(JAVA_HOME\jre\lib\ext)在这里插入图片描述

下载完成以后我们可以简单的写一段测试代码检测下是否配置存在异常
这里我们可以采用虚拟串口的方式先进行简单的测试
在这里插入图片描述

import gnu.io.*;

import java.io.*;

public class SerialTest {

    public static void main(String[] args) {
        // 串口名称,根据实际情况修改
        String portName = "COM3";
        // 波特率,根据实际情况修改
        int baudRate = 9600;

        try {
            // 获取串口实例
            CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
            if (portIdentifier.isCurrentlyOwned()) {
                System.out.println("Error: Port is currently in use");
            } else {
                // 打开串口并设置波特率
                CommPort commPort = portIdentifier.open(SerialTest.class.getName(), 2000);
                if (commPort instanceof SerialPort) {
                    SerialPort serialPort = (SerialPort) commPort;
                    serialPort.setSerialPortParams(baudRate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

                    // 获取输出流并发送数据
                    OutputStream outputStream = serialPort.getOutputStream();
                    outputStream.write("Hello World".getBytes());

                    // 关闭串口
                    serialPort.close();
                } else {
                    System.out.println("Error: Only serial ports are handled by this example.");
                }
            }
        } catch (NoSuchPortException | PortInUseException | UnsupportedCommOperationException | IOException ex) {
            System.out.println("Error: " + ex.getMessage());
        }
    }
}


可以看到,我们已经能够正常的将数据发送至串口

不过也有的可能会出现以下的错误信息
在这里插入图片描述
这边我分别使用了32位1.8和64位1.8进行了测试,发现32位没有出现这个问题,当使用1.8,361和1,8,382版本的时候都出现了这个问题,181却可以正常使用,如果大家遇到这个问题的时候,可以使用小版本较低的jdk1.8进行使用
在这里插入图片描述

打包

经过上面的安装和设置,我们已经可以使用java RXTX库进行串口开发了,如果需要进行打包操作的话,并且在maven环境下使用的话,可以使用我下面提供的代码
我们前面将RXTXcomm的jar添加到了lib包下面,所以打包的时候可以借助maven-shade插件将lib包也一起进行打包

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.1.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <createDependencyReducedPom>false</createDependencyReducedPom>
                            <transformers>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>mainClass</mainClass>

                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>com.googlecode.addjars-maven-plugin</groupId>
                <artifactId>addjars-maven-plugin</artifactId>
                <version>1.0.5</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>add-jars</goal>
                        </goals>
                        <configuration>
                            <resources>
                                <resource>
                                    <directory>${basedir}/lib</directory>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

使用mvn package命令即可将项目项目打包成jar的形式在这里插入图片描述

最后

使用java进行串口开发的场景使用并不多,如果涉及到这方面的需求,可以根据我下面提供代码进行修改即可完成开发,同时我也会将我使用到的一切工具或代码上传到资源供大家下载使用。接下来我还会写一篇关于java smslib包相关的文章(实现手机通讯模块短信收发功能)

北斗

以下是我针对北京神州天鸿的北斗卫星电台编写的操作代码,提供给有需要的小伙伴

/**
 * @program: scada
 * @description: 操作串口使用北斗进行短信的收发
 * @author: Dongrui
 * @create: 2023-06-06 14:42
 **/
public class Beidou implements SerialPortEventListener {

    /**
     * 端口
     */
    String port;
    /**
     * 波特率
     */
    int baudRate;
    /**
     * 超时时间
     */
    int timeOut = 2000;


    //    输入和输出流
    public static InputStream inputStream;
    public static OutputStream outputStream;




    /**
     * @param port     端口
     * @param baudRate 波特率
     */
    public Beidou(String port, int baudRate) {
        this.port = port;
        this.baudRate = baudRate;
        System.out.println(port + " " + baudRate);
        initSerialPort();
    }

    /**
     * @param port     端口
     * @param baudRate 波特率
     * @param timeout  超时时间
     */
    public Beidou(String port, int baudRate, int timeout) {
        this.port = port;
        this.baudRate = baudRate;
        this.timeOut = timeout;
        System.out.println(port + " " + baudRate);
        initSerialPort();
    }

    /**
     * 初始化串口
     */
    private void initSerialPort() {
        SerialPort serialPort = null;
        try {
            CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(port);
            serialPort = (SerialPort) portIdentifier.open("BDSerialCommunication", timeOut);
            serialPort.setSerialPortParams(baudRate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
            // 获取输入输出流
            inputStream = serialPort.getInputStream();
            outputStream = serialPort.getOutputStream();
//            添加串口事件监听器
            serialPort.addEventListener(this);
            serialPort.notifyOnDataAvailable(true);
            // 设置当通信中断时唤醒中断线程
            serialPort.notifyOnBreakInterrupt(true);
        } catch (NoSuchPortException e) {
            Logger.getInstance().logError("not found port:" + port, null, null);
        } catch (PortInUseException e) {

            Logger.getInstance().logError("port:" + port + " in use", null, null);
        } catch (IOException e) {
            Logger.getInstance().logError("port:" + port + " get stream fail", null, null);

        } catch (TooManyListenersException e) {
            Logger.getInstance().logError("port:" + port + " too many listeners", null, null);

        } catch (UnsupportedCommOperationException e) {
            Logger.getInstance().logError("port:" + port + " not support param," +
                    "baudRate:" + baudRate, null, null);

        }

    }

    /**
     * 生成校验码
     *
     * @param str
     * @return
     */
    private static char checkSum(String str) {
        int result = str.charAt(0);
        for (int i = 1; i < str.length(); i++) {
            result = str.charAt(i) ^ result;
        }

        return (char) result;

    }

    /**
     * 发送短信
     *
     * @param senderID                    收信方id:1表示本机id,2表示随机id,3表示公司,4表示广播;其中,2和3仅仅适用于管理型用户终端,4仅仅适用于网管中心控制用户终端
     * @param recipientAddress            收信方地址,当收信方为神州天鸿终端时,收信方地址为神州天鸿终端的id好
     * @param confidentialityRequirements 保密要求:1表示不保密,2表示保密
     * @param receiptFlag                 回执标志,0表示不需要回执,1表示需要回执,这里的回执可能是系统回执或通信回执
     * @param messageContent              电文内容,字符与数字用ascii码表示,汉字用gb2312码表示(两个字节表示一个汉字),电文内容的长度最多不超过200个字节
     * @throws IOException
     */
    public void sendMessage(int senderID, int recipientAddress, int confidentialityRequirements, int receiptFlag, String messageContent) throws IOException {


        int length = messageContent.getBytes("GB2312").length;
//        发送短信的指令
        String instructions = "$TTCA" + "," + senderID + "," + recipientAddress + "," + confidentialityRequirements + "," + receiptFlag + "," + length + "," + messageContent + ",";
//      生成校验码
        char checksum = checkSum(instructions);

//        发送至串口的字符串
        String str = instructions + checksum + "\r\n";
        Logger.getInstance().logInfo("北斗操作串口发送短信:" + str, null, null);
//      写至串口
        outputStream.write(str.getBytes());
        outputStream.flush();

    }


    /**
     * 查询状态输出频度
     *
     * @return
     * @throws IOException
     * @throws InterruptedException
     */
    public void queryStatus() throws IOException, InterruptedException {
        queryStatus(0);
    }

    /**
     * 状态输出频度
     *
     * @param stateOutputFrequency 时间间隔,单位为秒,范围0~255,当状态输出频度为0时,表示只向外设输出一次状态信息
     * @return
     * @throws IOException
     * @throws InterruptedException
     */
    public void queryStatus(int stateOutputFrequency) throws IOException, InterruptedException {
        String instructions = "$QSTA" + "," + stateOutputFrequency + ",";

        char checksum = checkSum(instructions);
        String str = instructions + checksum + "\r\n";
//        往串口发送数据
        outputStream.write(str.getBytes());
        outputStream.flush();


    }

    /**
     * 定位申请
     *
     * @param confidentialityRequirements 保密要求
     * @param positioningType             定位类型
     * @param heightMeasurementMethod     测高方式
     * @param knownElevation              已知高程
     * @param serviceFrequency            服务频度
     */
    public void positioningApplication(int confidentialityRequirements, int positioningType, int heightMeasurementMethod, int knownElevation, int antennaHeight, int serviceFrequency) throws IOException, InterruptedException {

        String data = "$PAPP" + "," + confidentialityRequirements + "," + positioningType + "," + knownElevation + "," + heightMeasurementMethod + "," + knownElevation + "," + antennaHeight + "," + serviceFrequency + ",";
        System.out.println(data);
        char checksum = checkSum(data);
        String str = data + checksum + "\r\n";
        outputStream.write(str.getBytes());
        outputStream.flush();

    }



    @Override
    public void serialEvent(SerialPortEvent serialPortEvent) {
        if (serialPortEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
            try {
                int availableBytes = inputStream.available();
                byte[] buffer = new byte[availableBytes];
                inputStream.read(buffer);
                // 处理接收到的数据
                String receivedData = new String(buffer);
                handleSerialPortData(receivedData);
                System.out.println("Received data: " + receivedData);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    private void handleSerialPortData(String response) {
		//加入自己的业务代码即可
    }

   

}

声光报警器

以下为操作声光报警器的代码,提供给需要的小伙伴

public static void main(String[] args) {
        String portName = "COM3"; // 替换为您的串口号
        int baudRate = 9600; // 根据您的设备设置正确的波特率

        try {
            // 打开串口
            SerialPort serialPort = (SerialPort) CommPortIdentifier.getPortIdentifier(portName).open("SerialCommunicationExample", 2000);
            serialPort.setSerialPortParams(baudRate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

            // 获取输入输出流
            InputStream inputStream = serialPort.getInputStream();
            OutputStream outputStream = serialPort.getOutputStream();

            // 发送指令
            String hexCommand = "7EFF063A000101EF";
            byte[] commandBytes = hexStringToByteArray(hexCommand);

            outputStream.write(commandBytes);
            outputStream.flush();

//            // 接收响应
//            byte[] buffer = new byte[1024];
//            int bytesRead = inputStream.read(buffer);
//            System.out.println("收到的数据" + bytesRead);
//            String response = byteArrayToHexString(buffer, bytesRead);
//            System.out.println("Received response: " + response);
//
//            // 关闭串口
//            serialPort.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 将十六进制字符串转换为字节数组
    private static byte[] hexStringToByteArray(String hexString) {
        int len = hexString.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4)
                    + Character.digit(hexString.charAt(i + 1), 16));
        }
        return data;
    }

    // 将字节数组转换为十六进制字符串
    private static String byteArrayToHexString(byte[] bytes, int length) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            sb.append(String.format("%02X", bytes[i]));
        }
        return sb.toString();
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/917294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP S/4 BP(Business Partner)之一次性客商设置

目录 前言 一、一次性客商是什么&#xff1f; 二、BP创建步骤 1.开始步骤 总结 前言 在ECC里的一次性客商跟在S/4有一些区别&#xff0c;本文主要介绍在S/4里创建一次性BP的步骤。 一、一次性客商是什么&#xff1f; 一次性供应商是指我们通常不经常从其采购材料的供应商…

课程实录 | Ingress Controller 的工作原理(下)

原文作者&#xff1a;陶辉 - 杭州智链达数据有限公司&#xff0c;联合创始人兼 CTO 原文链接&#xff1a;课程实录 | Ingress Controller 的工作原理&#xff08;下&#xff09; 转载来源&#xff1a;NGINX 开源社区 NGINX 唯一中文官方社区 &#xff0c;尽在 nginx.org.cn 编者…

Android Lottie加载gson文件动画

一&#xff1a;Lottie的使用 在你工程的build.gradle文件里添加如下配置 implementation com.airbnb.android:lottie:3.4.0二&#xff1a;布局文件直接引入LottieAnimationView <com.airbnb.lottie.LottieAnimationViewandroid:id"id/lottie_view"android:layout…

axios 介绍

axios 介绍 axios 是一款基于 javascript xhr 进行封装的插件&#xff0c;自己通过 xhr 进行编写 ajax 请求&#xff0c;实现起来逻辑比较复杂&#xff0c;axios 封装后将复杂的逻辑写在插件的内部&#xff0c;我们用户只需要关心如何调用即可。对我们的开发带来了很大的便捷。…

在App备案的规则下,开发者的技术选型更加重要了

网站 ICP 备案已施行了很久&#xff0c;我们也非常清楚必须在进行 ICP 备案后&#xff0c;网站才能在大陆范围合法运营&#xff0c;并且用户可以通过域名正常访问网站。 但是月初出了新规&#xff0c;明年起&#xff0c;国内的 App 也要像网站一样进行备案了。想必大家也是早已…

HTTPS证书如何申请?只需这五个步骤

在如今的互联网时代&#xff0c;网络安全变得愈发重要。为了保障网站内数据的安全&#xff0c;许多网站都开始使用HTTPS协议来进行数据传输。而谷歌、百度等搜索巨擘启用全站HTTPS加密服务&#xff0c;更是掀起了网站HTTPS加密的浪潮。那么申请HTTPS证书都需要什么&#xff1f;…

Typora mac版本安装

提示&#xff1a;文章介绍&#xff0c;Typora在Mac系统中免费安装使用 文章目录 一、官网下载二、安装 一、官网下载 官网地址&#xff1a;https://www.typoraio.cn/ 二、安装 安装好后按 command 空格键&#xff0c;找到 Typora的安装路径 /Applications/Typora.app/Con…

信创、工业软件国产化:全面解析三大实时操作系统

信创与国产工业操作系统可以擦出什么火花。 信创技术的快速发展&#xff0c;为国产工业操作系统的研发和应用提供了广阔的空间。 工业操作系统作为工业制造的大脑和神经&#xff0c;工业软件已渗透和应用到工业领域几乎所有核心环节。工业操作系统是智能制造的核心&#xff0c;…

Vue3.2中使用swiper实现层叠式轮播图

介绍 在 vue3 中使用 swiper 实现缩略图的轮播图效果&#xff0c;具体如下图所示&#xff1a; 代码 <template><div classindex><div class"banner-box"><swiper:autoplay"state.autoplay":loop"state.loop":speed&q…

2023 Android 折叠屏适配详解,是时候点亮新技能了

自 2019 年三星发布了第一台&#xff08;柔宇不算&#xff09; Galaxy Z Fold 之后&#xff0c;Android 厂商们都陆续跟进了各自的可折叠方案&#xff0c;之后折叠屏手机市场一直保持快速增长&#xff0c;例如 2023 年上半年整体销量 227 万台&#xff0c;同比增长 102.0%。 虽…

某支付巨头:提升安全内生“数智”能力,筑牢应用安全长城

某企业是支付领域巨头&#xff0c;处于行业核心地位&#xff0c;推动了中国支付产业的智能化和数字化转型。该企业提供相关专业化服务和金融科技服务&#xff0c;共建开放生态&#xff0c;打造数字网络&#xff0c;服务全球支付。 构建金融操作系统 推动中国金融数字化发展 …

爬虫:绕过5秒盾Cloudflare和DDoS-GUARD

本文章仅供技术研究参考&#xff0c;勿做它用&#xff01; 5秒盾的特点 <title>Just a moment...</title> 返回的页面中不是目标数据&#xff0c;而是包含上面的代码&#xff1a;Just a moment... 或者第一次打开网页的时候&#xff1a; 这几个特征就是被Cloud…

2023年7月天猫糕点市场数据分析(天猫数据怎么看)

烘焙食品行业是近几年食品领域比较火热的赛道之一&#xff0c;随着居民饮食结构的变化&#xff0c;人均消费水平的上升&#xff0c;蛋糕、面包等烘焙糕点越发成为消费者饮食的重要组成部分。同时&#xff0c;在烘焙糕点市场中&#xff0c;老品牌不断推新迭变&#xff0c;新品牌…

线性代数的学习和整理11: 子式与余子式

目录 1 原始矩阵A 2 子式&#xff08;都是行列式&#xff09; 2.1 k阶子式 2.2 k阶主子式 2.3 k阶顺序主子式 3 余子式 3.1 余子式 3.2 代数余子式 3.3 余子式作用是&#xff1f; 1 原始矩阵A 下面设计一个原始矩阵A&#xff0c;故意设计为A34, 行数≠列数 $$ \lef…

【车载开发系列】UDS当中的时间参数

【车载开发系列】UDS当中的时间参数 UDS当中的时间参数 【车载开发系列】UDS当中的时间参数一. 术语定义二. 网络层时间调整参数三. ECU诊断层与会话层参数 一. 术语定义 缩写全称中文说明BSBlock Size块大小STminSeparation time min时间间隙SIService Identifier服务标识符S…

如何在App里拉起小程序?

什么是小程序运行时框架&#xff1f; FinClip 的小程序编程模型是分为多个页面&#xff0c;每个页面有自己的 template、CSS 和 JS&#xff0c;实际在运行的时候&#xff0c;业务逻辑的 JS 代码是运行在独立的 JavaScript 引擎中&#xff0c;每个页面的 template 和 CSS 是运行…

使用Jetpack Compose构建可折叠Card

使用Jetpack Compose构建可折叠Card 为何在Android应用开发中使用扩展卡片 扩展卡片在Android应用开发中广受欢迎&#xff0c;它们可以让开发者打造干净紧凑的用户界面&#xff0c;同时可以轻松展开&#xff0c;显示额外的内容。 通过巧妙地使用扩展卡片&#xff0c;开发者可…

磁盘阵列/视频集中存储/安防监控视频智能分析平台新功能:安全帽/反光衣/安全带AI识别详解

人工智能技术已经越来越多地融入到视频监控领域中&#xff0c;近期我们也发布了基于AI智能视频云存储/安防监控视频AI智能分析平台的众多新功能&#xff0c;该平台内置多种AI算法&#xff0c;可对实时视频中的人脸、人体、物体等进行检测、跟踪与抓拍&#xff0c;支持口罩佩戴检…

基于swing的教务管理系统java jsp学生教师信息mysql源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于swing的教务管理系统 系统有3权限&#xff1a;管…

气传导耳机哪个好?推荐几款性能表现不错的气传导耳机

​蓝牙耳机大家都很熟悉&#xff0c;如果更了解一些的朋友&#xff0c;一定也知道气传导耳机。气传导耳机最大的好处在于不入耳佩戴更舒适&#xff0c;户外使用时还能听到周围环境音&#xff0c;不会屏蔽汽车鸣笛声&#xff0c;使用更加安全。但也还有很多小伙伴不知道气传导耳…