使用RXTXcomm进行串口通信

article/2025/10/6 19:05:53

RXTXcomm 串口通信

虚拟串口和串口调试助手的使用

  • 虚拟串口软件:VSPD,https://www.eltima.com/cn/products/vspdxp/

    • VSPD会自动识别出本台计算上有几个物理串口,例如本机只有一个物理串口COM1。在右侧端口管理的分页中,添加虚拟端口。虚拟端口是成对出现的,如COM2和COM3,其编号由VSPD自动检测本地物理串口资源后,自动为虚拟串口排号。单击“Add pair”按钮为计算机添加虚拟串口组对。

      为何是组对出现,COM2->COM3和COM3->COM2,串口通信是异步的,允许发送数据的同时接收数据,数据流向是双向的。组对出现我们可以通过串口调试助手分别从两端进行调试。
      在这里插入图片描述

  • 串口调试助手:COMHelper,需要可留言私信你滴邮箱,打包发你。

    • 开箱即用,开启串口,点击即用。

使用效果如下:
在这里插入图片描述

Java RXTXcomm 实现串口通信并调试

  • 下载RXTXcomm

    • RXTXcomm提供了 Windows x64, x86, ia64 and Linux x86, x86_64等操作系统支持。http://fizzed.com/oss/rxtx-for-java
  • 根据机器配置解压缩文件夹,复制相关Jar包及DLL文件
    在这里插入图片描述

    • RXTXcomm.jar -> <JAVA_HOME>\jre\lib\ext
    • rxtxSerial.dll -> <JAVA_HOME>\jre\bin
    • rxtxParallel.dll -> <JAVA_HOME>\jre\bin
  • 将Jar包添加到项目lib中,IDE使用的是IDEA,项目构建方式为Maven
    在这里插入图片描述

  • 创建SerialPortDataHandle类,继承Thread类,并实现SerialPortEventListener接口,具体代码如下:

    public class SerialPortDataHandle extends Thread implements SerialPortEventListener {private static final Logger logger = LoggerFactory.getLogger(SerialPortDataHandle.class);// 通讯端口管理,控制对通信端口的访问的中心类static CommPortIdentifier portManager;// 有效连接上的端口的枚举static Enumeration<?> portList;// 串口输入流引用static InputStream inputStream;// 串口输出流引用static OutputStream outputStream;// 串口对象引用static SerialPort serialPort;// 堵塞队列:用来存放串口发送到服务端的数据private BlockingQueue<String> msgQueue = new LinkedBlockingQueue<>();// 线程控制标识private boolean flag = true;@Overridepublic void serialEvent(SerialPortEvent event) {switch (event.getEventType()) {/**  SerialPortEvent.BI:/*Break interrupt,通讯中断*  SerialPortEvent.OE:/*Overrun error,溢位错误*  SerialPortEvent.FE:/*Framing error,传帧错误*  SerialPortEvent.PE:/*Parity error,校验错误*  SerialPortEvent.CD:/*Carrier detect,载波检测*  SerialPortEvent.CTS:/*Clear to send,清除发送*  SerialPortEvent.DSR:/*Data set ready,数据设备就绪*  SerialPortEvent.RI:/*Ring indicator,响铃指示*  SerialPortEvent.OUTPUT_BUFFER_EMPTY:/*Output buffer is empty,输出缓冲区清空*/case SerialPortEvent.BI:case SerialPortEvent.OE:case SerialPortEvent.FE:case SerialPortEvent.PE:case SerialPortEvent.CD:case SerialPortEvent.CTS:case SerialPortEvent.DSR:case SerialPortEvent.RI:case SerialPortEvent.OUTPUT_BUFFER_EMPTY: break;// 当有可用数据时读取数据case SerialPortEvent.DATA_AVAILABLE:// 数据接收缓冲容器byte[] readBuffer = new byte[200];try {// 存储待接收读取字节数大小int numBytes = 0;while (inputStream.available() > 0) {numBytes = inputStream.read(readBuffer);if (numBytes > 0) {msgQueue.add(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " 收到的串口发送数据为:"+ new String(readBuffer));// 数据接收缓冲容器清空初始化readBuffer = new byte[200];}}} catch (IOException e) {logger.error("IO异常", e);}break;}}public int init() {// 通过串口通信管理类获得当前连接上的端口列表//(获取一个枚举对象,该CommPortIdentifier对象包含系统中每个端口的对象集[串口、并口])portList = CommPortIdentifier.getPortIdentifiers();while (portList.hasMoreElements()) {// 获取相应串口对象portManager = (CommPortIdentifier) portList.nextElement();/**  判断端口类型是否为串口*  PORT_SERIAL = 1; 【串口】*  PORT_PARALLEL = 2; 【并口】*  PORT_I2C = 3; 【I2C】*  PORT_RS485 = 4; 【RS485】*  PORT_RAW = 5; 【RAW】*/if (portManager.getPortType() == CommPortIdentifier.PORT_SERIAL) {logger.info("串口设备名称:" + portManager.getName());// 判断模拟COM4串口存在,就打开该串口if (portManager.getName().equals("COM4")) {logger.info("测试串口设备名称:" + portManager.getName());try {if (Objects.isNull(serialPort)) {// 打开串口,设置名字为COM_4(自定义),延迟阻塞时等待3000毫秒(赋值给预设的串口引用)serialPort = (SerialPort)portManager.open("COM4", 3000);logger.info("串口设备COM4已打开");}} catch (PortInUseException e) {logger.error("串口使用异常", e);return 0;}// 在串口引用不为空时进行下述操作if (Objects.nonNull(serialPort)) {// 1. 设置串口的输入输出流引用try {inputStream = serialPort.getInputStream();outputStream = serialPort.getOutputStream();} catch (IOException e) {logger.error("串口输入输出IO异常", e);return 0;}// 2. 设置串口监听器try {serialPort.addEventListener(this);} catch (TooManyListenersException e) {logger.error("串口监听器添加异常", e);return 0;}// 设置监听器在有数据时通知生效serialPort.notifyOnDataAvailable(true);// 3. 设置串口相关读写参数try {// 比特率、数据位、停止位、校验位serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);} catch (UnsupportedCommOperationException e) {logger.error("串口设置操作异常", e);return 0;}return 1;}return 0;}}}return 0;}@Overridepublic void run() {try {logger.info("串口线程已运行");while (flag) {// 如果堵塞队列中存在数据就将其输出if (msgQueue.size() > 0) {// take() 取走BlockingQueue里排在首位的对象// 若BlockingQueue为空,阻断进入等待状态直到Blocking有新的对象被加入为止logger.info(msgQueue.take());}}} catch (InterruptedException e) {logger.error("线程执行异常", e);}}public void stopGetDataBySerialPort() {this.flag = false;}public static void main(String[] args) {SerialPortDataHandle handle = new SerialPortDataHandle();int i = handle.init();if (i == 1) {// 线程启动handle.start();}}
    }
    
  • 启动线程并测试(线程会占用并开启COM4串口,我们使用COM5串口进行通信测试,执行main方法前要从串口调试工具中关闭COM4串口,不然会出现gnu.io.PortInUseException: Unknown Application异常)

    • 执行main方法,启动线程

      15:34:59.083 [main] INFO com.jeesite.modules.hp.serialport.SerialPortDataHandle - 串口设备名称:COM1
      15:34:59.089 [main] INFO com.jeesite.modules.hp.serialport.SerialPortDataHandle - 串口设备名称:COM2
      15:34:59.089 [main] INFO com.jeesite.modules.hp.serialport.SerialPortDataHandle - 串口设备名称:COM3
      15:34:59.089 [main] INFO com.jeesite.modules.hp.serialport.SerialPortDataHandle - 串口设备名称:COM4
      15:34:59.089 [main] INFO com.jeesite.modules.hp.serialport.SerialPortDataHandle - 测试串口设备名称:COM4
      15:34:59.102 [main] INFO com.jeesite.modules.hp.serialport.SerialPortDataHandle - 串口设备COM4已打开
      15:34:59.103 [Thread-0] INFO com.jeesite.modules.hp.serialport.SerialPortDataHandle - 串口线程已运行
      
    • 通过串口调试工具进行数据发送,查看服务端控制台输出信息
      在这里插入图片描述

    • 查看虚拟端口状态
      在这里插入图片描述


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

相关文章

C#实现串口通信解析

1. 串口硬件信号定义 串口通信&#xff08;Serial Communications&#xff09;是指外设和计算机间通过数据信号线、地线等按位&#xff08;bit&#xff09;进行传输数据的一种通信方式&#xff0c;属于串行通信方式&#xff0c;能够实现远距离通信&#xff0c;长度可达1200米。…

10、STM32的串口(UART)及串口通信原理(内附代码)

一、通信接口介绍 1、处理器与外部设备通信的两种方式&#xff1a; 并行通信 - 传输原理&#xff1a;数据各个位同时传输。 -优点&#xff1a;速度快 -缺点&#xff1a;占用引脚资源多 串行通信 - 传输原理&#xff1a;数据按位顺序传输&#xff0…

串口通信的概念与实现

uart串口通信概念数据结构termios作用与设置串口读写实现 UART串口通信概念 通用异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter)&#xff0c;通常称作uart&#xff0c;是一种异步收发传输器&#xff0c;uart作为异步串口通信协议的一种&#xff0c;…

java基于RXTXcomm的串口程序

准备工作 首先下载官方提供的jar包和.dll文件&#xff0c;dll文件有两个&#xff0c;一个是rxtxSerial&#xff0c;一个是rxtxParallel&#xff0c;分别表示串口和并口。因为我开发串口&#xff0c;所以把rxtxSerial.dll放到了jdk1.8.0_171/jre/bin和jre1.8.0_171/bin目录下&a…

51单片机串口多机通信的原理与编程实现

51单片机串口多机通信 需要用的的寄存器 (了解的可直接跳到下一节&#xff09; TMOD 定时器/计数器模式控制寄存器TCON 定时器控制寄存器SCON 串口控制寄存器PCON 电源控制位寄存器IE 中断中断使能寄存器 补充说明&#xff0c;TH1 预置值计算&#xff0c;中断源 波特率计算公式…

Java串口通信详解

序言 说到开源&#xff0c;恐怕很少有人不挑大指称赞。学生通过开源代码学到了知识&#xff0c;程序员通过开源类库获得了别人的成功经验及能够按时完成手头的工程&#xff0c;商家通过开源软件赚到了钱……&#xff0c;总之是皆大欢喜。然而开源软件或类库的首要缺点就是大多缺…

Java串口通信(RXTX)

这几天要用到串口通信,而我最会的Java,所以我就去学了一下怎么用Java进行串口通信 用的jar包是RXTX官网:http://rxtx.qbang.org/ 下载地址:http://fizzed.com/oss/rxtx-for-java 下载好Jar包后,首先需要配置,这里我用的Eclipse Window->Preferences->Java->Build …

十一、串口通信的基本原理与应用

通常用&#xff1a;SMOD 0&#xff0c;0xfd 利用51单片机的串行接口与上位机建立传输信道进行数据的收发。采用8位UART模式&#xff0c;即模式1&#xff0c;波特率为9600BPS。数据发送采用查询方式&#xff0c;数据接收采用中断方式。 系统上电初始化之后&#xff0c;单片机向…

【超简单的串口通信的工作原理】

下图是电脑收到单片机经过串口发送的信息&#xff0c; 那么电脑是如何与单片机进行串口通信的呢&#xff1f; 首先&#xff0c;任何一种通信都要包括硬件物理接口和软件通信协议。 串口通信物理接口如下图。单片机通过发送端将数据从左往右一位一位按顺序发送&#xff1b;且在…

串口通信基本原理

目录 串口通信连线&#xff1a; 串口通信时序&#xff1a; 起始位&#xff1a; 数据位&#xff1a; 校验位&#xff1a; 停止位&#xff1a; 总结&#xff1a; 串口通信特点&#xff1a; 基于串口的通讯接口&#xff1a; 串口通信连线&#xff1a; 任何通信都要有信息…

一篇短文让你彻底理解什么是串口通信

1 并行与串行通信 机器的通信方式有两种&#xff0c;分别是并行通信与串行通信。 并行通信&#xff1a;并行通信是指多比特数据同时通过并行线进行传送&#xff0c;这样数据传送速度大大提高&#xff0c;但并行传送的线路长度受到限制&#xff0c;因为长度增加&#xff0c;干…

Java RXTX 实现串口通信

目录 串口&#xff08;通信&#xff09;概述 串口调试助手 RXTX 下载与依赖 Java 开发实战 串口(通信)概述 1、串口通信是指串口按位&#xff08;bit&#xff09;发送和接收字节 2、串口通信可以在使用一根线发送数据的同时用另一根线接收数据 3、串口通信常用的协议包括…

串口通信原理

并行通信是指数据的各个位用多条数据线同时进行传输 优点&#xff1a;传输速度快 缺点&#xff1a;占用引脚资源多 串行通信是将数据分成一位一位的形式在一条传输线上逐个传输 优点&#xff1a;通信线路简单、占用引脚资源少 缺点&#xff1a;传输速度慢 同步通信&#xf…

串口通讯基本原理 【详细】

串口通信的基本知识 本文介绍了串口通讯的基本概念、数据格式、通讯方式、典型的串口通讯标准等内容。 串口通讯&#xff0c;RS232,RS485&#xff0c;停止位&#xff0c;奇校验&#xff0c;偶校验 1 串口通讯 串口通讯(Serial Communication)&#xff0c;是指外设和计算…

串口通信的基本原理详解

目录 串口通信 串口通信的两种基本方式 异步数据的数据发送过程 异步通信的数据接收过程 9针串口&#xff08;DB9&#xff09; TTL与RS232区别 TTL: RS232&#xff1a; 串口通信的数据格式 通讯方式 偶校验与奇校验 停止位 波特率&#xff08;波特率就是每秒钟传输…

串口通信原理详解

串口通信是一种串行异步通信&#xff0c;通信双方以字符帧作为数据传输单位&#xff0c;字符帧按位依次传输&#xff0c;每个位占固定的时间长度。两个字符帧之间的传输时间间隔可以是任意的&#xff0c;即传输完一个字符帧之后&#xff0c;可以间隔任意时间再传输下一个字符帧…

14_串口通信原理

通信方式的两种: 并行通讯: 传输原理:数据各个位同时传输。 优点:速度快 缺点:占用引脚资源多 串行通信: 传输原理:数据按位顺序传输。 优点:占用引脚资源少 缺点:速度相对较慢 串行通信: 按照数据传送方向,分为: 单工:数据传输只支持数据在一个方向上传输。 半双工:…

【Linux】基于美信串行解串器实现UART串口通信

文章目录 前言一、环境介绍二、硬件配置1. MAX967632. MAX96752F 三、串口通信协议1. 帧格式2. 同步帧3. 应答帧4. 包格式&#xff08;包由帧组成&#xff09; 四、内核模块实现 前言 车载项目中串行/解串器是十分常见的外设&#xff0c;目前常用的有两种标准&#xff1a;GMSL…

毫米波雷达图解算法原理(基于TI雷达)

毫米波雷达数据处理原理 前言基础bin文件解读 以下我们取1帧进行操作&#xff1a;对数据矩阵进行操作前的转换——开始计算结果矩阵一维FFT&#xff08;距离&#xff09;二维FFT&#xff08;速度&#xff09;角度维FFT &#xff08;假设利用结果已经获取目标&#xff09;对目标…

【阵列信号处理】DOA估计算法

DOA估计中的ESPRIT算法 ESPRIT算法时一种利用子空间旋转法估计DOA参数的方法&#xff0c;其算法的基本思想是将阵列在结构上分成两个完全一致的子列&#xff0c;两个子列相应阵元偏移的距离相等&#xff0c;也就是说阵列的阵元被分成一对对的形式&#xff0c;而且每一对之间具…