Java串口通信JSerialComm的实现

 更新时间:2026年01月28日 09:09:42   作者:元正~Richarlie  
本文介绍了使用JSerialComm库进行Java串口通信,包括引入库的方式、设置和操作串口、发送与接收数据以及添加数据监听器,具有一定的参考价值,感兴趣的可以了解一下

一、引入JSerialComm包

目前网上的Java串口通信主要使用RXTXComm,但是这个库已经很久没有更新(最近的更新似乎在2012年),并且与JavaFX集成打包时会出现BUG。JSerialComm是一个较新的串口通信库,其主页为jSerialComm (fazecast.github.io)。JSerialComm与平台无关,所以不需要配置dll文件,只需要引入jar文件即可使用,更为方便。

一、引入JSerialComm包

JSerialComm可以直接通过Maven引入,也可以复制jar包到lib目录下直接使用。Maven的依赖可以在JSerialComm的主页上看到,目前为:

<dependency>
   <groupId>com.fazecast</groupId>
   <artifactId>jSerialComm</artifactId>
   <version>[2.0.0,3.0.0)</version>
</dependency>

主页上同时也有其他类型的引入方法

二、使用JSerialComm

2.1 寻找、设置、打开及关闭串口

SerialPort[] serialPorts = SerialPort.getCommPorts();//查找所有串口
for(SerialPort port:serialPorts){
    System.out.println("Port:"+port.getSystemPortName());//打印串口名称,如COM4
    System.out.println("PortDesc:"+port.getPortDescription());//打印串口类型,如USB Serial
    System.out.println("PortDesc:"+port.getDescriptivePortName());//打印串口的完整类型,如USB-SERIAL CH340(COM4)
}
SerialPort serialPort = serialPorts[0];//获取到第一个串口
serialPort.setBaudRate(112500);//设置波特率为112500
serialPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_BLOCKING | SerialPort.TIMEOUT_WRITE_BLOCKING, 1000, 1000);//设置超时
serialPort.serRTS();//设置RTS。也可以设置DTR
serialPort.setFlowControl(SerialPort.FLOW_CONTROL_DISABLED);//设置串口的控制流,可以设置为disabled,或者CTS, RTS/CTS, DSR, DTR/DSR, Xon, Xoff, Xon/Xoff等
serialPort.setComPortParameters(112500, 8, SerialPort.ONE_STOP_BIT, SerialPort.NO_PARITY);//一次性设置所有的串口参数,第一个参数为波特率,默认9600;第二个参数为每一位的大小,默认8,可以输入5到8之间的值;第三个参数为停止位大小,只接受内置常量,可以选择(ONE_STOP_BIT, ONE_POINT_FIVE_STOP_BITS, TWO_STOP_BITS);第四位为校验位,同样只接受内置常量,可以选择 NO_PARITY, EVEN_PARITY, ODD_PARITY, MARK_PARITY,SPACE_PARITY。
if(!serialPort.isOpen){
    boolean isCommOpeded = serialPort.openPort()//判断串口是否打开,如果没打开,就打开串口。打开串口的函数会返回一个boolean值,用于表明串口是否成功打开了
}
serialPort.closePort();//关闭串口。该函数同样会返回一个boolean值,表明串口是否成功关闭

2.2 发送及接收数据

数据的发送函数是SerialPort.writeBytes(byte[] bytes,int length),第一个参数是要发送的字节数组,第二个参数是要发送的数据长度。

数据的读取函数是SerialPort.readBytes(byte[] bytes,int length),第一个参数是要将数据读入的字节数组,第二个参数是要接收的数据长度。

可以用SerialPort.bytesAvailable来获取目前串口中可以读取的字符长度。如果目前没有可读取的数据,则会返回-1

使用示例如下

if(serialPort.isOpen()){
    String writeData = "hello world";//要发送的字符串
    byte[] bytes = writeData.getBytes();//将字符串转换为字节数组
    serialPort.writeBytes(bytes,bytes.length);//将字节数组全部写入串口
    Thread.sleep(100);//休眠0.1秒,等待下位机返回数据。如果不休眠直接读取,有可能无法成功读到数据
    String readData = "";
    while(port.bytesAvailable>0){//循环读取所有的返回数据。如果可读取数据长度为0或-1,则停止读取
        byte[] newData = new byte[port.bytesAvailable()];//创建一个字节数组,长度为可读取的字节长度
        int numRead = port.readBytes(newData, newData.length);//将串口中可读取的数据读入字节数组,返回值为本次读取到的字节长度
        String newDataString = new String(newData);//将新数据转为字符串
        readData = readData + newDataString;//组合字符串
        Thread.sleep(20);//休眠0.02秒,等待下位机传送数据到串口。如果不休眠,直接再次使用port.bytesAvailable()函数会因为下位机还没有返回数据而返回-1,并跳出循环导致数据没读完。休眠时间可以自行调试,时间越长,单次读取到的数据越多。
    }
    System.out.println("readString:"+readData);
}

2.3 监听串口

可以对串口添加一个监听器来实时监听串口。监听器位于一个独立的线程,使用时需要注意多线程通信的问题;

if(serialPort.isOpen){
    serialPort.addDataListener(new SerialPortDataListener() {//添加监听器。由于该监听器有两个函数,无法使用Lambda表达式

			@Override
			public int getListeningEvents() {
				// TODO Auto-generated method stub
				return SerialPort.LISTENING_EVENT_DATA_AVAILABLE;//返回要监听的事件类型,以供回调函数使用。可发回的事件包括:SerialPort.LISTENING_EVENT_DATA_AVAILABLE,SerialPort.LISTENING_EVENT_DATA_WRITTEN,SerialPort.LISTENING_EVENT_DATA_RECEIVED。分别对应有数据在串口(不论是读的还是写的),有数据写入串口,从串口读取数据。如果AVAILABLE和RECEIVED同时被监听,优先触发RECEIVED
			}

			@Override
			public void serialEvent(SerialPortEvent event) {//事件处理函数
				// TODO Auto-generated method stub
				String data = "";
				if (event.getEventType() != SerialPort.LISTENING_EVENT_DATA_AVAILABLE){
					return;//判断事件的类型
                }
				while(port.bytesAvailable()!=0) {
					byte[] newData = new byte[port.bytesAvailable()];
					int numRead = port.readBytes(newData, newData.length);
					String newDataString = new String(newData);
					data = data + string;
					try {
						Thread.sleep(20);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}//同样使用循环读取法读取所有数据
                //由于这里是监听函数,所以也可以不使用循环读取法,在监听器外创建一个全局变量,然后将每次读取到的数据添加到全局变量里
			}
			
		})
}

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

相关文章

  • springBoot @Scheduled实现多个任务同时开始执行

    springBoot @Scheduled实现多个任务同时开始执行

    这篇文章主要介绍了springBoot @Scheduled实现多个任务同时开始执行,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java学习之理解自动拆装箱特性

    java学习之理解自动拆装箱特性

    这篇文章主要介绍java自动拆装箱特性以及java自动拆装箱的应用,有需要的朋友可以借鉴参考下,希望可以有所帮助,祝大家早日升职加薪
    2021-09-09
  • 使用Jackson-json解析一个嵌套的json字符串

    使用Jackson-json解析一个嵌套的json字符串

    这篇文章主要介绍了使用Jackson-json解析一个嵌套的json字符串,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java中Minio的基本使用详解

    Java中Minio的基本使用详解

    这篇文章主要介绍了Java中Minio的基本使用详解,MinIO 是一个基于Apache License v2.0开源协议的对象存储服务,它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,需要的朋友可以参考下
    2024-01-01
  • springboot新建项目pom.xml文件第一行报错的解决

    springboot新建项目pom.xml文件第一行报错的解决

    这篇文章主要介绍了springboot新建项目pom.xml文件第一行报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java异常处理 Throwable实现方法解析

    Java异常处理 Throwable实现方法解析

    这篇文章主要介绍了Java异常处理 Throwable实现方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • SpringBoot优雅实现计算方法执行时间

    SpringBoot优雅实现计算方法执行时间

    这篇文章主要为大家详细介绍了SpringBoot中优雅实现计算方法执行时间的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-04-04
  • quartz时间表达式Cron详解

    quartz时间表达式Cron详解

    这篇文章介绍了quartz时间表达式Cron,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • java 获取已知文件扩展名的代码

    java 获取已知文件扩展名的代码

    java 编写程序获取已知文件的扩展名. 注意: abc.txt的扩展名是txt, abc.java.txt的扩展名也是txt.,需要的朋友可以参考下
    2017-02-02
  • java排查死锁示例

    java排查死锁示例

    这篇文章主要介绍了java排查死锁示例,通过java中简单的死锁示例引出四种排查死锁的工具,详细讲解请看全文,希望对大家有所帮助
    2021-08-08

最新评论