JavaDemo——java使用RXTX读写串口

article/2025/10/31 14:03:29
对RXTX的介绍,copy自https://blog.csdn.net/u011728105/article/details/48085615
RXTXRXTX是一个提供串口和并口通信的开源java类库,由该项目发布的文件均遵循LGPL协议。RXTX项目提供了Windows,Linux,Mac os X,Solaris操作系统下的兼容javax.comm串口通讯包API的实现,为其他开发人员在此类系统下开发串口应用提供了相当的方便。RXTX的使用上与sun提供的comm.jar基本相同,编程时最明显的不同是要包含的包名由javax.comm.*改成了gnu.io.*RxtxAPI 的核心是抽象的CommPort类(用于描述一个被底层系统支持的端口的抽象类,它包含一些高层的IO控制方法,这些方法对于所有不同的通讯端口来说是通用的)及其两个子类:SerialPort类和ParallePort类。其中,SerialPort类是用于串口通信的类,ParallePort类是用于并行口通信的类。CommPort类还提供了常规的通信模式和方法,例如:getInputStream( )方法和getOutputStream( )方法,专用于与端口上的设备进行通信。然而,这些类的构造方法都被有意的设置为非公有的(non-public)。所以,不能直接构造对象,而是先通过静态的CommPortIdentifer.getPortIdentifiers()获得端口列表,再从这个端口列表中选择所需要的端口,并调用CommPortIdentifer对象的Open( )方法,这样,就能得到一个CommPort对象。当然,还要将这个CommPort对象的类型转换为某个非抽象的子类,表明是特定的通讯设备,该子类可以是SerialPort类和ParallePort类中的一个。下面将分别对CommPortIdentifier类,串口类SerialPort进行详细的介绍。接口CommDriver可负载设备(the loadable device)驱动程序接口的一部分CommPortOwnershipListener传递各种通讯端口的所有权事件ParallelPortEventListener传递并行端口事件SerialPortEventListener传递串行端口事件类CommPort通讯端口CommPortIdentifier通讯端口管理ParallelPort并行通讯端口ParallelPortEvent并行端口事件SerialPortRS-232串行通讯端口SerialPortEvent 串行端口事件异常类NoSuchPortException当驱动程序不能找到指定端口时抛出PortInUseException当碰到指定端口正在使用中时抛出UnsupportedCommOperationException驱动程序不允许指定操作时抛出CommPortIdentifier类这个类主要用于对通信端口进行管理和设置,是对端口进行访问控制的核心类,主要包括以下方法:addPortName(String,int, CommDriver) 添加端口名到端口列表里addPortOwnershipListener(CommPortOwnershipListener)添加端口拥有的监听器removePortOwnershipListener(CommPortOwnershipListener)移除端口拥有的监听器getCurrentOwner()获取当前占有端口的对象或应用程序getName()获取端口名称getPortIdentifier(CommPort)获取指定打开的端口的CommPortIdentifier类型对象getPortIdentifier(String)获取以参数命名的端口的CommPortIdentifier类型对象getPortIdentifiers()获取系统中的端口列表getPortType()获取端口的类型isCurrentlyOwned()判断当前端口是否被占用open(FileDescriptor)用文件描述的类型打开端口open(String,int) 打开端口,两个参数:程序名称,延迟时间(毫秒数)SerialPort类这个类用于描述一个RS-232串行通信端口的底层接口,它定义了串口通信所需的最小功能集。通过它,用户可以直接对串口进行读、写及设置工作。SerialPort类中关于串口参数的静态成员变量说明:DATABITS_5 数据位为5DATABITS_6 数据位为6DATABITS_7 数据位为7DATABITS_8 数据位为8PARITY_NONE 空格检验PARITY_ODD 奇检验PARITY_EVEN 偶检验PARITY_MARK 标记检验PARITY_SPACE 无检验STOPBITS_1 停止位为1STOPBITS_2 停止位为2STOPBITS_1_5 停止位为1.5SerialPort类中关于串口参数的方法说明:getBaudRate()得到波特率getParity()得到检验类型getDataBits()得到数据位数getStopBits()得到停止位数setSerialPortParams(int,int, int, int) 设置串口参数依次为(波特率,数据位,停止位,奇偶检验)SerialPort类中关于事件的静态成员变量说明:BI Break interrupt 通讯中断FE Framing error 帧错误CD Carrier detect 载波侦听OE Overrun error 溢位错误CTS Clear to send 清除发送PE Parity error 奇偶检验错误DSR Data set ready 数据设备准备好RI Ring indicator 响铃侦测DATA_AVAILABLE 串口中的可用数据OUTPUT_BUFFER_EMPTY 输出缓冲区已清空SerialPort类中关于事件的方法说明:isCD()是否有载波isCTS()是否清除以传送isDSR()数据是否备妥isDTR()是否数据端备妥isRI()是否响铃侦测isRTS()是否要求传送addEventListener(SerialPortEventListener)向SerialPort对象中添加串口事件监听器removeEventListener()移除SerialPort对象中的串口事件监听器notifyOnBreakInterrupt(boolean)设置中断事件true有效,false无效notifyOnCarrierDetect(boolean)设置载波监听事件true有效,false无效notifyOnCTS(boolean)设置清除发送事件true有效,false无效notifyOnDataAvailable(boolean)设置串口有数据的事件true有效,false无效notifyOnDSR(boolean)设置数据备妥事件true有效,false无效notifyOnFramingError(boolean)设置发生错误事件true有效,false无效notifyOnOutputEmpty(boolean)设置发送缓冲区为空事件true有效,false无效notifyOnParityError(boolean)设置发生奇偶检验错误事件true有效,false无效notifyOnRingIndicator(boolean)设置响铃侦测事件true有效,false无效getEventType()得到发生的事件类型返回值为int型sendBreak(int)设置中断过程的时间,参数为毫秒值setRTS(boolean)设置或清除RTS位setDTR(boolean)设置或清除DTR位SerialPort中的其他常用方法说明:close()关闭串口getOutputStream()得到OutputStream类型的输出流getInputStream()得到InputStream类型的输入流


准备工作:
  • RXTX包:mfz-rxtx-2.2-20081207-win-x64.zip,解压,RXTXcomm.jar加入项目依赖库里,rxtxParallel.dll和rxtxSerial.dll放入jdk的bin目录下(我使用的jdk1.7,jdk9好像不兼容)
  • 虚拟串口工具:VSPD+6.9.zip,
  • 串口调试工具:SerialDebug.exe

安装RXTX包:


工具创建一对虚拟串口:



串口调试工具打开COM3:


测试Demo:

/*** createtime : 2018年6月1日 上午9:47:36*/
package com.testRXTX;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.TooManyListenersException;import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;/*** TODO* @author XWF*/
public final class RXTXtest {/*** @param args*/public static void main(String[] args) {//获得系统端口列表getSystemPort();//开启端口COM2,波特率9600final SerialPort serialPort = openSerialPort("COM2",9600);//启动一个线程每2s向串口发送数据,发送1000次hellonew Thread(new Runnable() {@Overridepublic void run() {int i = 1;while(i<1000) {String s = "hello";byte[] bytes = s.getBytes();RXTXtest.sendData(serialPort, bytes);//发送数据i++;try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}}}).start();//设置串口的listenerRXTXtest.setListenerToSerialPort(serialPort, new SerialPortEventListener() {@Overridepublic void serialEvent(SerialPortEvent arg0) {if(arg0.getEventType() == SerialPortEvent.DATA_AVAILABLE) {//数据通知byte[] bytes = RXTXtest.readData(serialPort);System.out.println("收到的数据长度:"+bytes.length);System.out.println("收到的数据:"+new String(bytes));}}});
//        closeSerialPort(serialPort);}/*** 获得系统可用的端口名称列表* @return 可用端口名称列表*/@SuppressWarnings("unchecked")public static List<String> getSystemPort(){List<String> systemPorts = new ArrayList<>();//获得系统可用的端口Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers();while(portList.hasMoreElements()) {String portName = portList.nextElement().getName();//获得端口的名字systemPorts.add(portName);}System.out.println("系统可用端口列表:"+systemPorts);return systemPorts;}/*** 开启串口* @param serialPortName 串口名称* @param baudRate 波特率* @return 串口对象*/public static SerialPort openSerialPort(String serialPortName,int baudRate) {try {//通过端口名称得到端口CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(serialPortName);//打开端口,(自定义名字,打开超时时间)CommPort commPort = portIdentifier.open(serialPortName, 2222);//判断是不是串口if (commPort instanceof SerialPort) {SerialPort serialPort = (SerialPort) commPort;//设置串口参数(波特率,数据位8,停止位1,校验位无)serialPort.setSerialPortParams(baudRate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);                              System.out.println("开启串口成功,串口名称:"+serialPortName);return serialPort;}        else {//是其他类型的端口throw new NoSuchPortException();}} catch (NoSuchPortException e) {e.printStackTrace();} catch (PortInUseException e) {e.printStackTrace();} catch (UnsupportedCommOperationException e) {e.printStackTrace();}return null;}/*** 关闭串口* @param serialPort 要关闭的串口对象*/public static void closeSerialPort(SerialPort serialPort) {if(serialPort != null) {serialPort.close();System.out.println("关闭了串口:"+serialPort.getName());serialPort = null;}}/*** 向串口发送数据* @param serialPort 串口对象 * @param data 发送的数据*/public static void sendData(SerialPort serialPort, byte[] data) {OutputStream os = null;try {os = serialPort.getOutputStream();//获得串口的输出流os.write(data);os.flush();} catch (IOException e) {e.printStackTrace();} finally {try {if (os != null) {os.close();os = null;}                } catch (IOException e) {e.printStackTrace();}}}/*** 从串口读取数据* @param serialPort 要读取的串口* @return 读取的数据*/public static byte[] readData(SerialPort serialPort) {InputStream is = null;byte[] bytes = null;try {is = serialPort.getInputStream();//获得串口的输入流int bufflenth = is.available();//获得数据长度while (bufflenth != 0) {                             bytes = new byte[bufflenth];//初始化byte数组is.read(bytes);bufflenth = is.available();} } catch (IOException e) {e.printStackTrace();} finally {try {if (is != null) {is.close();is = null;}} catch(IOException e) {e.printStackTrace();}}return bytes;}/*** 给串口设置监听* @param serialPort* @param listener*/public static void setListenerToSerialPort(SerialPort serialPort, SerialPortEventListener listener) {try {//给串口添加事件监听serialPort.addEventListener(listener);} catch (TooManyListenersException e) {e.printStackTrace();}serialPort.notifyOnDataAvailable(true);//串口有数据监听serialPort.notifyOnBreakInterrupt(true);//中断事件监听}}

结果:



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

相关文章

使用RXTX实现简单串口通信调试工具

最终效果如下图&#xff1a; 1、把rxtxParallel.dll、rxtxSerial.dll拷贝到&#xff1a;C:\WINDOWS\system32下。 2、RXTXcomm.jar 添加到项目类库中。 package serialPort;import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import j…

Springboot + rxtx 实现串口读写 案例

经过大量翻阅文章总结出springboot连接串口最可行的方法&#xff01;希望能帮到大家( •̀ ω •́ )✧ 使用Rxtx实现串口通信 1、配置pom.xml <!-- 串口内容读取 --><dependency><groupId>org.bidib.jbidib.org.qbang.rxtx</groupId><artifactId&…

java使用RXTX的详细总结

1 简介 项目要求&#xff1a;读取串口信息&#xff0c;并输出展示相应的图像&#xff0c;本篇文章不深入谈前端的内容着重于后端遇到的问题。2021-01-08更新&#xff0c;发现一个重大的问题&#xff1a;如果有人能解决的话请在评论区回复&#xff1a; 在连上串口后&#xff0c…

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;构建的 首先解释一下什么是…