给大家分项下用RXTX库实现JAVA串口编程。

一 准备工作

1.1 下载资源文件

首先下载RXTX库对应的资源文件。下载地址 http://fizzed.com/oss/rxtx-for-java 大家根据自己的系统下载对应的文件。

  • Windows-x64 对应windows 64位系统。
  • Windows-x86 对应windows 32位系统。
  • Windows-ia64 这种用的比较少,我们不管。
  • Linux-x86_64 对应Linux 64位系统。
  • Linux-i386 对应Linux 32位系统。

每个文件下面都有我们下面需要的所有文件。

1.1 拷贝动态库

RXJX的实现还需要依赖几个动态库,所以我们要先把动态库放到对应的jdk目录下面去。window和linux拷贝的文件不同,如下所示:

window平台:

  • 拷贝 rxtxSerial.dll —> <JAVA_HOME>\jre\bin
  • 拷贝 rxtxParallel.dll —> <JAVA_HOME>\jre\bin

linux平台:

  • 拷贝 librxtxSerial.so —> <JAVA_HOME>/jre/lib/i386/
  • 拷贝 librxtxParallel.so —> <JAVA_HOME>/jre/lib/i386/

1.2 项目引入RXTXcomm.jar

RXTXcomm.jar文件引入到工程代码里面去。

比如我们把RXTXcomm.jar文件放到工程目录下resource/jar目录下面去。然后在pom.xml中把RXTXcomm.jar引入进来。

        <!-- 串口jar --><dependency><groupId>gnu.io</groupId><artifactId>com-lib</artifactId><version>2.2</version><scope>system</scope><systemPath>${project.basedir}/src/main/resources/jar/RXTXcomm.jar</systemPath></dependency>

二 实现代码

前面准备工作做好了,接下来就是代码实现,好多代码咱们也是从网上copy过来的,这里我就直接贴代码了。

2.1 串口参数的简单封装

package com.pilot.ioserver.basic.pbl.port.serialPort;import gnu.io.SerialPort;/*** @name: SerialPortParameter* @author: tuacy.* @date: 2019/6/26.* @version: 1.0* @Description: 串口参数*/
public final class SerialPortParameter {/*** 串口名称(COM0、COM1、COM2等等)*/private String serialPortName;/*** 波特率* 默认:115200*/private int baudRate;/*** 数据位 默认8位* 可以设置的值:SerialPort.DATABITS_5、SerialPort.DATABITS_6、SerialPort.DATABITS_7、SerialPort.DATABITS_8* 默认:SerialPort.DATABITS_8*/private int dataBits;/*** 停止位* 可以设置的值:SerialPort.STOPBITS_1、SerialPort.STOPBITS_2、SerialPort.STOPBITS_1_5* 默认:SerialPort.STOPBITS_1*/private int stopBits;/*** 校验位* 可以设置的值:SerialPort.PARITY_NONE、SerialPort.PARITY_ODD、SerialPort.PARITY_EVEN、SerialPort.PARITY_MARK、SerialPort.PARITY_SPACE* 默认:SerialPort.PARITY_NONE*/private int parity;public SerialPortParameter(String serialPortName) {this.serialPortName = serialPortName;this.baudRate = 115200;this.dataBits = SerialPort.DATABITS_8;this.stopBits = SerialPort.STOPBITS_1;this.parity = SerialPort.PARITY_NONE;}public SerialPortParameter(String serialPortName, int baudRate) {this.serialPortName = serialPortName;this.baudRate = baudRate;this.dataBits = SerialPort.DATABITS_8;this.stopBits = SerialPort.STOPBITS_1;this.parity = SerialPort.PARITY_NONE;}public String getSerialPortName() {return serialPortName;}public void setSerialPortName(String serialPortName) {this.serialPortName = serialPortName;}public int getBaudRate() {return baudRate;}public void setBaudRate(int baudRate) {this.baudRate = baudRate;}public int getDataBits() {return dataBits;}public void setDataBits(int dataBits) {this.dataBits = dataBits;}public int getStopBits() {return stopBits;}public void setStopBits(int stopBits) {this.stopBits = stopBits;}public int getParity() {return parity;}public void setParity(int parity) {this.parity = parity;}
}

2.2 串口工具类的简单封装

package com.pilot.ioserver.basic.pbl.port.serialPort;import gnu.io.*;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;/*** @name: SerialPortUtil* @author: tuacy.* @date: 2019/6/26.* @version: 1.0* @Description: 串口工具类*/
public class SerialPortUtil {/*** 获得系统可用的端口名称列表(COM0、COM1、COM2等等)** @return List<String>可用端口名称列表*/@SuppressWarnings("unchecked")public static List<String> getSerialPortList() {List<String> systemPorts = new ArrayList<>();//获得系统可用的端口Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers();while (portList.hasMoreElements()) {String portName = portList.nextElement().getName();//获得端口的名字systemPorts.add(portName);}return systemPorts;}/*** 打开串口** @param serialPortName 串口名称* @return SerialPort 串口对象* @throws NoSuchPortException               对应串口不存在* @throws PortInUseException                串口在使用中* @throws UnsupportedCommOperationException 不支持操作操作*/public static SerialPort openSerialPort(String serialPortName)throws NoSuchPortException, PortInUseException, UnsupportedCommOperationException {SerialPortParameter parameter = new SerialPortParameter(serialPortName);return openSerialPort(parameter);}/*** 打开串口** @param serialPortName 串口名称* @param baudRate       波特率* @return SerialPort 串口对象* @throws NoSuchPortException               对应串口不存在* @throws PortInUseException                串口在使用中* @throws UnsupportedCommOperationException 不支持操作操作*/public static SerialPort openSerialPort(String serialPortName, int baudRate)throws NoSuchPortException, PortInUseException, UnsupportedCommOperationException {SerialPortParameter parameter = new SerialPortParameter(serialPortName, baudRate);return openSerialPort(parameter);}/*** 打开串口** @param serialPortName 串口名称* @param baudRate       波特率* @param timeout        串口打开超时时间* @return SerialPort 串口对象* @throws NoSuchPortException               对应串口不存在* @throws PortInUseException                串口在使用中* @throws UnsupportedCommOperationException 不支持操作操作*/public static SerialPort openSerialPort(String serialPortName, int baudRate, int timeout)throws NoSuchPortException, PortInUseException, UnsupportedCommOperationException {SerialPortParameter parameter = new SerialPortParameter(serialPortName, baudRate);return openSerialPort(parameter, timeout);}/*** 打开串口** @param parameter 串口参数* @return SerialPort 串口对象* @throws NoSuchPortException               对应串口不存在* @throws PortInUseException                串口在使用中* @throws UnsupportedCommOperationException 不支持操作操作*/public static SerialPort openSerialPort(SerialPortParameter parameter)throws NoSuchPortException, PortInUseException, UnsupportedCommOperationException {return openSerialPort(parameter, 2000);}/*** 打开串口** @param parameter 串口参数* @param timeout   串口打开超时时间* @return SerialPort串口对象* @throws NoSuchPortException               对应串口不存在* @throws PortInUseException                串口在使用中* @throws UnsupportedCommOperationException 不支持操作操作*/public static SerialPort openSerialPort(SerialPortParameter parameter, int timeout)throws NoSuchPortException, PortInUseException, UnsupportedCommOperationException {//通过端口名称得到端口CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(parameter.getSerialPortName());//打开端口,(自定义名字,打开超时时间)CommPort commPort = portIdentifier.open(parameter.getSerialPortName(), timeout);//判断是不是串口if (commPort instanceof SerialPort) {SerialPort serialPort = (SerialPort) commPort;//设置串口参数(波特率,数据位8,停止位1,校验位无)serialPort.setSerialPortParams(parameter.getBaudRate(), parameter.getDataBits(), parameter.getStopBits(), parameter.getParity());System.out.println("开启串口成功,串口名称:" + parameter.getSerialPortName());return serialPort;} else {//是其他类型的端口throw new NoSuchPortException();}}/*** 关闭串口** @param serialPort 要关闭的串口对象*/public static void closeSerialPort(SerialPort serialPort) {if (serialPort != null) {serialPort.close();System.out.println("关闭了串口:" + serialPort.getName());}}/*** 向串口发送数据** @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();}} 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) {//初始化byte数组bytes = new byte[bufflenth];is.read(bytes);bufflenth = is.available();}} catch (IOException e) {e.printStackTrace();} finally {try {if (is != null) {is.close();}} catch (IOException e) {e.printStackTrace();}}return bytes;}/*** 给串口设置监听** @param serialPort serialPort 要读取的串口* @param listener   SerialPortEventListener监听对象* @throws TooManyListenersException 监听对象太多*/public static void setListenerToSerialPort(SerialPort serialPort, SerialPortEventListener listener) throws TooManyListenersException {//给串口添加事件监听serialPort.addEventListener(listener);//串口有数据监听serialPort.notifyOnDataAvailable(true);//中断事件监听serialPort.notifyOnBreakInterrupt(true);}}

2.3 测试类

我们简单的写一个单元测试类

package com.pilot.ioserver.basic.pbl.port.serialPort;import gnu.io.*;
import org.junit.Test;import java.util.List;
import java.util.TooManyListenersException;/*** @name: SerialPortUtilTest* @author: tuacy.* @date: 2019/6/26.* @version: 1.0* @Description: 串口测试代码*/
public class SerialPortUtilTest {/*** 测试获取串口列表*/@Testpublic void getSystemPortList() {List<String> portList = SerialPortUtil.getSerialPortList();System.out.println(portList);}/*** 测试串口打开,读,写操作*/@Testpublic void serialPortAction() {try {final SerialPort serialPort = SerialPortUtil.openSerialPort("COM2", 115200);//启动一个线程每2s向串口发送数据,发送1000次hellonew Thread(() -> {int i = 1;while (i < 1000) {String s = "hello";byte[] bytes = s.getBytes();SerialPortUtil.sendData(serialPort, bytes);//发送数据i++;try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}}).start();//设置串口的listenerSerialPortUtil.setListenerToSerialPort(serialPort, event -> {//数据通知if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {byte[] bytes = SerialPortUtil.readData(serialPort);System.out.println("收到的数据长度:" + bytes.length);System.out.println("收到的数据:" + new String(bytes));}});try {// sleep 一段时间保证线程可以执行完Thread.sleep(3 * 30 * 1000);} catch (InterruptedException e) {e.printStackTrace();}} catch (NoSuchPortException | PortInUseException | UnsupportedCommOperationException | TooManyListenersException e) {e.printStackTrace();}}}

三 测试

代码写完了,接下来就是验证了。我是在window条件下验证测试的,也在网上找了两个工具,一个模拟串口工具,一个串口命令工具。为了方便大家我们把这两个工具放一起又重新上传在csdn上了。下载地址 https://download.csdn.net/download/wuyuxing24/11260170

3.1 虚拟串口

使用虚拟串口工具,虚拟两个串口。比如这里我们虚拟了COM1和COM2出来。

3.2 运行单元测试代码

运行我们上面编写的测试代码(测试代码我们连接COM2)。同时启动串口调试工具,测试下串口的收发。

这样我们就用RXTX简单的实现了串口的收发逻辑。其他更加高级的用法大家可以去看看RXTX的文档。

RXTX实现JAVA串口编程相关推荐

  1. java rxtx version_RXTX实现JAVA串口编程

    给大家分项下用RXTX库实现JAVA串口编程. 一 准备工作 1.1 下载资源文件 首先下载RXTX库对应的资源文件.下载地址 http://fizzed.com/oss/rxtx-for-java ...

  2. java串口编程-读取称重仪表中净重

    一.需求说明 将仪表和计算机串口相连,计算机通过软件向仪表发送指令,然后仪表返回结果,在计算机软件界面上显示. 二.实现过程 1.查看仪表说明书 仪表型号为XK3190-A9,主要是查看相关参数(波特 ...

  3. Java串口编程学习1-环境配置(64位Win7)

    最近在做zigbee的课程设计,需要Java实现对串口数据的读写操作. 网上找了很多代码,好像都比较过时了,直接拿来用没法跑通--QAQ--然后自己写个教程留底,如有不当之处还请各位路过的大神赐教. ...

  4. JAVA 串口编程 (三)

    四.实例分析 同API一起下载的还有一个examples文件,里面有个最简单的读.写程序,对其进行注释,以增进了理. (1)读串口 1  import java.io.*; 2  import jav ...

  5. java串口编程程序_想成为程序员,学编程,Python、Go、Java、C++,你选什么?

    很多时候,我们都不得不做出选择.就拿想成为程序员学编程这件事来说,想学一门编程语言,是选择最新潮的Python.Go,还是选择比较传统的JAVA和C++呢? 要做出选择,就得先进行比较. 其实不同编程 ...

  6. JAVA 串口编程 (一)

    一.环境配置 (1)解压复制文件 解压javacomm20-win32.zip 把win32com.dll复制到<JAVA_HOME>/jre/bin 和<JDK>/bin目录 ...

  7. JAVA 串口编程(二)

    三.实例 (1)打开.关闭串口 首先使用CommPortIdentifier中的方法,获取可用的端口,并且选择一个端口打开作为通信端口. A:枚举可用端口 1  void listPortChoice ...

  8. java 串口 rxtx_【Java】基于RXTX的Java串口通信

    public classSerialPortManager {/*** 查找可用端口 * *@return可用端口名称列表*/ public static final ListfindPorts() ...

  9. GPRS模块的使用Java串口操作(1)

    最近在鼓捣--GPRS模块的使用&Java串口操作,小结如下: GPRS模块:PTM100: PC.串口连接线: Java串口编程 GPRS模块常用的操作(AT指令): 常规指令,按enter ...

最新文章

  1. BZOJ1965 [Ahoi2005]SHUFFLE 洗牌 快速幂
  2. Java8 lambda表达式10个示例
  3. [转]JS脚本抢腾讯云学生1元代金券
  4. oracle怎么捕获表上的DML语句(不包括select)语句)
  5. 复习上学期的HTML+CSS(1)
  6. 【Netty】TCP粘包和拆包
  7. 高效的SQLSERVER分页查询
  8. 《02》let 和 const 命令
  9. PAT 数字分类(20)
  10. 机器人图形变变变_《有魔法的形状》l 走进数学的艺术世界——创意拼搭,图形变变变...
  11. 软件测试方法口诀,自测记忆法
  12. linux+kvm虚拟化+搭建openstack云平台,私有云搭建
  13. 中基鸿业工薪家庭理财方法
  14. UR机器人(二):Path and Time Scaling
  15. CMN_1022: [FreeTDS][SQL Server]The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION
  16. ROS学习:tf坐标系
  17. 【Lua 教程系列第 4 篇】Lua 中的第一行代码 hello world
  18. 【Apache】You don't have permission to access / on this server.问题解决
  19. “达人”计划丨达观数据2019届校园招聘正式启动
  20. PM25文本相似度算法JAVA实现

热门文章

  1. 系统重装教程-使用PE盘
  2. 刘芹:我从雷军和周鸿祎身上学到的几点创业经验
  3. 字节大牛耗时八个月又一力作,详细的Android学习指南
  4. Mysql数据库平滑扩容解决高并发和大数据量问题
  5. Template、ItemsPanel、ItemContainerStyle、ItemTemplate
  6. 图书管理系统的数据库表结构(三)
  7. 智哪儿观察:2021光亚展什么智能值得看?
  8. 程序员是怎样玩植物大战僵尸的
  9. java一只母牛 一年生头小牛_面向对象思想 解决农场母牛生小牛问题
  10. winform 处理tabcontrol控件,隐藏顶部的tab标签,及tabcontrol的边框线