java使用RXTX的详细总结

article/2025/10/31 16:16:09

1 简介

  • 项目要求:读取串口信息,并输出展示相应的图像,本篇文章不深入谈前端的内容着重于后端遇到的问题。
  • 2021-01-08更新,发现一个重大的问题:如果有人能解决的话请在评论区回复:
    • 在连上串口后,当你突然把串口拔开,程序会报出很多异常,原因是SerialPortEventListener作为监听的接口无法被注销掉,如果使用serialPort进行注销,则主程序会崩溃(这种崩溃用Error或者Throwable接收不到)。看了底层源码,发现调用的是C++的API,所以可能没法解决。
    • 解决办法是:自己用C++写一个串口功能,然后在JAVA中用JNI调用吧。

2 开发阶段

2.1 RXTX包使用前的部署

  1. 下载该包
    也可以从百度云下载:https://pan.baidu.com/s/1Ruu90kNFi5QJcpwFcJB3LQ,提取码:4hpz

  2. 由于手动导入的时候我遇到了点问题,所以选择先将 RXTXcomm.jar 导入到本地仓库,然后在maven项目中引入
    手动导入的指令

mvn install:install-file -DgroupId=gnu.io -DartifactId=rxtx -Dversion=2.1.7 -Dpackaging=jar -Dfile=“G:\迅雷下载\rxtx-2.1-7-bins-r2\rxtx-2.1-7-bins-r2\RXTXcomm.jar”

然后再在maven项目中引入

<dependency><groupId>gnu.io</groupId><artifactId>rxtx</artifactId><version>2.1.7</version>
</dependency>
  1. 还需要复制dll
    复制 rxtxParallel.dll 和 rxtxSerial.dll 到 C:\Program Files\Java\jdk1.8.0_241\jre\bin 下,如果无法打包,可以将 jar 包复制到C:\Program Files\Java\jdk1.8.0_241\jre\lib 中

RXTX的使用过程:
在这里插入图片描述

2.2 获取所有可用的端口信息

  • CommPortIdentifier 类内部有三个主要的成员变量可以获取
  • 串口的名称类似于:“COM1”
  • 端口类型包括:I2C、并口、RS485、串口
// 获取当前所有可用的串口信息
Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers();
// 遍历所有的串口信息
while(portList.hasMoreElements()){// 获取下一个端口信息CommPortIdentifier com = (CommPortIdentifier) portList.nextElement();// 端口当前的拥有者,如果没有返回nullString currentOwner = com.getCurrentOwner();// 端口的名称String name = com.getName();// 端口的类型,需要解析int portType = com.getPortType();
}

2.3 解析端口类型的工具

/*** @Description:获取通信端口类型名称* @author:Lu* @date:2015-8-29 上午11:35:32*/
public static String getPortTypeName(int portType) {switch (portType) {case CommPortIdentifier.PORT_I2C:return "I2C";case CommPortIdentifier.PORT_PARALLEL: // 并口return "Parallel";case CommPortIdentifier.PORT_RAW:return "Raw";case CommPortIdentifier.PORT_RS485: // RS485端口return "RS485";case CommPortIdentifier.PORT_SERIAL: // 串口return "Serial";default:return "unknown type";}
}

2.4 处理接收数据

  • 通过 CommPortIdentifier 类对象,打开端口,并获取到连接对象CommPort类的实例。该实例有个好用的子类 SerialPort类,可强转成该类
/*** 打开端口,注意操作顺序,输入流一定要先获取*/
private void openPort() {try {/*** open方法(应用程序名【随意命名】,阻塞时等待的毫秒数)* open方法打开通讯端口,获得一个CommPort对象,它使程序独占端口。* 如果端口正被其他应用程序占用,将使用CommPortOwnershipListener事件机制* 传递一个PORT_OWNERSHIP_REQUESTED事件。* 每个端口都关联一个InputStream和一个OutputStream,如果端口是用* open方法打开的,那么任何的getInputStream都将返回相同的数据流对象,除非 有close被调用。*/// open:(应用程序名【随意命名】,阻塞时等待的毫秒数)SerialPort serialPort = (SerialPort) commPortIdentifier.open("OpenPortServer", 2000);// 获取输入流inputStream = serialPort.getInputStream();// 设置串口监听,this对象即本类对象需要继承SerialPortEventListener接口。或者你在这里写一个匿名接口也行。接口内部函数的写法在下面serialPort.addEventListener(this);// 设置串口数据时间有效(可监听)serialPort.notifyOnDataAvailable(true);serialPort.notifyOnBreakInterrupt(true);// 设置串口通讯参数,可以参考SerialPort类的源码,里面有相关的常量// 波特率// 数据位个数// 停止位// 校验方式,0代表无奇偶校验,1代表偶校验,2代表偶校验serialPort.setSerialPortParams(9600, 8, 1, 0);} catch (PortInUseException e) {// 端口正在使用throw new RuntimeException(e);} catch (Exception e) {// 输入输出流错误throw new RuntimeException(e);}
}
  • 监听器
    • 监听器必须实现SerialPortEventListener接口,并通过serialPort.addEventListener(this);来注册监听器
    • 通过设置监听器来处理接收数据
    • 注意关闭操作的时候需要在 serialPort 中使用removeEventListener方法注销监听器,并且关闭输入流
  • 注意,上面获取到的InputStream的读取方法是阻塞方法,当没有数据的时候会阻塞等待数据的来临。
/*** 在这里进行连接状态判断** @param event 连接状态*/
@Override
public void serialEvent(SerialPortEvent event) {switch (event.getEventType()) {/*** 通讯中断*/case SerialPortEvent.BI: {}break;/*** 溢位错误*/case SerialPortEvent.OE: {}break;/*** 帧错误*/case SerialPortEvent.FE: {}break;/*** 奇偶校验错误*/case SerialPortEvent.PE: {}break;/*** 载波检测*/case SerialPortEvent.CD: {}break;/*** 清除发送*/case SerialPortEvent.CTS: {}break;/*** 数据设备准备好*/case SerialPortEvent.DSR: {}break;/*** 响铃侦测*/case SerialPortEvent.RI: {}break;/*** 输出缓冲区已清空*/case SerialPortEvent.OUTPUT_BUFFER_EMPTY: {}break;/*** 有数据到达*/case SerialPortEvent.DATA_AVAILABLE: {// InputStream 通过serialPort在上面的代码中已经获取到了,在这里通过InputStream 读取字节流即可。字节流的操作和咱们一般用法一致// 在这里进行读取操作byte[] bytes = new byte[255];try {int len = inputStream.read(bytes);// 然后就是其他操作了} catch (IOException e) {e.printStackTrace();}}break;default: {}break;}
}

3 打包和运行

我的项目主要是在 Windows 系统下运行的。
1)idea 使用maven打包,发现没有主程序,这需要在pom.xml 加入下面这个插件

 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><mainClass>(你的启动类的全限定类名)com.wu.port.MySpringBootApplication</mainClass></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>

2)打包后,发现找不到RXTX的jar包,试了很久都是报这个错误。我的解决方法是:重新建立一个maven项目,把原来编的代码重新拷贝过来,然后再进行打包,发现就可以晕行了。
3)如果其他电脑要使用该项目,则必须要先安置好 .dll 文件,为此写一个批处理文件和 rxtxParallel.dll , rxtxSerial.dll , RXTXcomm.jar 放在一起

:: 本文件需要管理员权限运行
:: 获取当前路径
set cPath=%~dp0
cd /D cPath
:: 拷贝文件
copy rxtxParallel.dll %java_home%\jre\bin\  /y
copy rxtxSerial.dll %java_home%\jre\bin\  /y
copy RXTXcomm.jar %java_home%\jre\lib\ext\ /y

4)项目运行的批处理文件

:: 本文件不能以管理员身份运行,将本文件与jar包放置在一起
java -jar "%cd%\jar包名称"

http://chatgpt.dhexx.cn/article/AfU9f4Lj.shtml

相关文章

JAVA使用RXTXcomm进行串口通信(一)

1.引入RXTXcomm.JAR包 首先下载相应的jar文件 压缩包包括:RXTXcomm.jar(64位环境)、win32com.dll和javax.comm.properties。 下载地址:https://www.aliyundrive.com/s/JSeSQsAyYeZ 点击链接保存&#xff0c;或者复制本段内容&#xff0c;打开「阿里云盘」APP &#xff0c;无需…

SpringBoot使用RXTX连接串口教程及遇到的坑总结

文章目录 SpringBoot使用RXTX连接串口教程及遇到的坑总结一、所用环境及依赖二、部署流程2.1 下载RXTXComm包2.2 部署RXTXComm包 三、编写串口使用程序3.1 编写RXTXConfig.java3.2 编写实体类SerialPortEntity3.3 编写监听器SerialPortListener3.4 编写工具类SerialPortUtil3.5…

【计算机基础|计算机组成原理】【10】海明校验码

海明校验码 海明校验码思路 偶校验&#xff1a;1010 → 01010&#xff0c;能发现奇数位错误&#xff0c;但无法确定是哪一位出错 → 1个校验位只能携带2种状态信息&#xff1a;对/错 海明码设计思路&#xff1a;将信息位分组进行偶校验 → 多个校验位能携带多种状态信息&#x…

计算机组成原理汉明校验,海明校验码(计算机组成原理11)

海明校验码 视频链接地址&#xff1a; https://www.bilibili.com/video/BV1BE411D7ii?fromsearch&seid6420326887479343502 前言 在本篇中&#xff0c;你将掌握 海明码的基本思想 海明码的求解步骤和全校验码 在计算机内部进行存储、计算的数据都是以二进制形式传送&#…

海明校验码纠错设计原理

本文不阐述海明码计算方式&#xff0c;为了节省您的时间&#xff0c;请先学习海明码/奇偶校验是如何计算的&#xff0c;如果好奇其海明码的纠错设计思路再来看此文章&#xff01; 信息为位数为n&#xff0c;校验位数为k&#xff0c;正确状态占1位&#xff0c;所以总位数&#…

2.21 海明校验码

海明校验码 需要了解海明码的编码规则&#xff0c;要会计算需要多少位校验位。 海明码的编码规则 校验位&#xff1a; 校验位的位置是有规律的。都是位于2n。 比如20(1),21(2),22(4)。。都是校验位。 信息位&#xff1a;不是校验位的其他位置。 举个例子 当信息位有1位&am…

【软考学习7】数据校验——海明校验码、循环校验码、奇偶校验码

一、检错、纠错和码距 1.1 检错 从接收的报文中&#xff0c;检查出错误。 1.2 纠错 从接收的报文中检查出错误&#xff0c;并改正错误。 一般通过加冗余信息&#xff08;增大码距&#xff09;来实现。 1.3 码距 码距是整个编码系统中任意两个码字的最小距离。 也就是说&a…

超详细的海明校验码方法解读

海明校验码原理&#xff1a;在有效的信息为中加入几个校验位形成海明码&#xff0c;使码距[rjazgj1] 比较均匀地拉大&#xff0c;并把海明码的每个二进制位分配到几个奇偶校验组[rjazgj2] 中。当某一位出错后&#xff0c;就会引起有关的几个校验位的值发生变化&#xff0c;这不…

海明校验码原理以及作用机制的介绍

什么是海明校验码&#xff1f; 由Richard Hamming于1950年提出、还被广泛采用的一种很有效的校验方法&#xff0c;是只要增加少数几个校验位&#xff0c;就能检测出二位同时出错、亦能检测出一位出错并能自动恢复该出错位的正确值的有效手段&#xff0c;后者被称为自动纠错。 它…

海明校验码的计算及检验

海明校验码的计算及检验 目录 海明校验码的计算及检验知识背景计算海明校验码步骤一&#xff1a;计算校验码位数步骤二&#xff1a;确定校验组步骤三&#xff1a;计算校验码的值得出海明校验码 利用海明校验码校验数据其他 总结 最近和兄弟探讨一个海明校验码的题目&#xff0c…

海明校验码举例

海明校验码举例&#xff1a; 编制ASCII字符M的海明校验码。 解&#xff1a;M的ASCII码为A6A5A4A3A2A1A01001101 M为7位那么海明码最少需要2i&#xff0c;也就是说需要&#xff0c;才能表示出来&#xff0c;&#xff08;238&#xff09; 用哪些信息位分别被哪些校验位效验如…

计算机底层:海明校验码。

计算机底层&#xff1a;海明校验码。 海明校验码是由奇偶校验码中的偶校验延申出来的&#xff1a; 计算机底层&#xff1a;奇偶校验码_srhqwe的博客-CSDN博客 了解海明校验码之前需要先了解奇偶校验码。 海明校验码设计思路&#xff1a; 需要知道&#xff1a;多个校验位就能携…

海明校验码

1. 海明码的特点&#xff1a; 其中m表示数据位的位数&#xff0c;k表示海明校验码的位数 k位海明校验码一共可以表示种校验信息结果&#xff0c;其中有一种要用来表示没有出错的情况&#xff0c;则其余还剩-1种结果&#xff0c;为了使校验结果可以指出任一位出错的位置&#x…

计算机组成原理学习笔记:海明校验码

概述 海明校验码又可以称为汉明校验码, 这只是一个音译的问题, 作者是 Richard Hamming海明校验码对于信息纠错这个领域的贡献十分巨大&#xff0c;Richard Hamming 获得了1968年的图灵奖内容主要包括&#xff1a;海明校验码的思想、如何构建海明校验码、如何使用海明校验码 …

海明码校验【简单详细】

海明码 1.什么是海明码: 一个名叫Richard Hanming老爷爷在1950年提出的检验纠错方法&#xff0c;它具有一位纠错能力。 2.海明码的计算方法: 设欲检测的二进制代码为n位,K为检测位(提供纠错),总共nk位代码 当中检测位满足的关系: 2 k 2^{k} 2k>(nk1) 此关系也是求不同代码长…

一文看懂海明校验码及其计算方法(详细总结)

网上看了好几篇文章后终于算是捋明白了&#xff0c;但是看到的这些资源要么说得云里雾里&#xff0c;要么干脆说得有问题&#xff08;然后还被点了好多赞。。。&#xff09;&#xff0c;无论如何这些都容易误导小白。作为C站多年老潜水员&#xff0c;我还是把海明校验码的要点总…

ResNets

ResNets 背景&#xff1a; 非常非常深的神经网络是很难训练的&#xff0c;因为存在梯度消失和梯度爆炸问题。 《转载更改》 https://blog.csdn.net/qq_29893385/article/details/81207203 ResNets是由残差块&#xff08;Residual block&#xff09;构建的 首先解释一下什么是…

正确定位混淆后Crash代码行数

Android--定位混淆后Crash代码行数 一、需求背景二、前期准备三、对混淆日志进行还原四、示例 一、需求背景 打包时需要对代码进行混淆&#xff0c;目的是增加安全性&#xff0c;防⽌反编译。但这会导致App崩溃时&#xff0c;抓到的日志堆栈中显示的代码行数对应不上&#xff…

repalce

1、replace基本用法 <script>/*要求将字符串中所有的a全部用A代替*/var str "javascript is great script language!";//只会将第一个匹配到的a替换成Aconsole.log(str.replace("a", "A")); // > jAvascript is great script language…

Android studio 4.2新特性及升级异常

Android studio 版本及特性系列目录 Android 12 终于来了&#xff0c;你准备好了吗&#xff1f;Android studio 4.2新特性Android studio 4.1新特性Android Studio 4.0新特性及升级异常Android Studio3.6. 插件搜索不到终极解决方案 Android studio 4.2新特性 前言升级异常Gra…