java rxtx version_RXTX实现JAVA串口编程
给大家分项下用RXTX库实现JAVA串口编程。
一 准备工作
1.1 下载资源文件
首先下载RXTX库对应的资源文件。下载地址 http://fizzed.com/oss/rxtx-for-java 大家根据自己的系统下载对应的文件。
RXTX-FOR-JAVA.png
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 —> \jre\bin
拷贝 rxtxParallel.dll —> \jre\bin
linux平台:
拷贝 librxtxSerial.so —> /jre/lib/i386/
拷贝 librxtxParallel.so —> /jre/lib/i386/
1.2 项目引入RXTXcomm.jar
RXTXcomm.jar文件引入到工程代码里面去。
比如我们把RXTXcomm.jar文件放到工程目录下resource/jar目录下面去。然后在pom.xml中把RXTXcomm.jar引入进来。
gnu.io
com-lib
2.2
system
${project.basedir}/src/main/resources/jar/RXTXcomm.jar
二 实现代码
前面准备工作做好了,接下来就是代码实现,好多代码咱们也是从网上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可用端口名称列表
*/
@SuppressWarnings("unchecked")
public static List getSerialPortList() {
List systemPorts = new ArrayList<>();
//获得系统可用的端口
Enumeration 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 {
/**
* 测试获取串口列表
*/
@Test
public void getSystemPortList() {
List portList = SerialPortUtil.getSerialPortList();
System.out.println(portList);
}
/**
* 测试串口打开,读,写操作
*/
@Test
public void serialPortAction() {
try {
final SerialPort serialPort = SerialPortUtil.openSerialPort("COM2", 115200);
//启动一个线程每2s向串口发送数据,发送1000次hello
new 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();
//设置串口的listener
SerialPortUtil.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出来。
虚拟串口工具.png
3.2 运行单元测试代码
运行我们上面编写的测试代码(测试代码我们连接COM2)。同时启动串口调试工具,测试下串口的收发。
串口
这样我们就用RXTX简单的实现了串口的收发逻辑。其他更加高级的用法大家可以去看看RXTX的文档。
java rxtx version_RXTX实现JAVA串口编程相关推荐
- RXTX实现JAVA串口编程
给大家分项下用RXTX库实现JAVA串口编程. 一 准备工作 1.1 下载资源文件 首先下载RXTX库对应的资源文件.下载地址 http://fizzed.com/oss/rxtx-for-java ...
- JAVA实现RS-485串口编程
近期开发过程中遇到需要读取底层传感器串口数据的问题,也是从无到有的一个过程,爬了不少帖子在这里记录一下,也给后来的朋友们一点小小的帮助吧. 下载链接在文末 串口介绍 如图所示就是一种串口转换器: Ja ...
- java发送串口命令_如何發送命令到串口(JAVA + RXTX)
我有一個發送數據輸入到重量平衡的問題.我需要發送一個ESC P CR LF命令.我使用RXTX庫.我不知道爲什麼它不起作用.以下是代碼.如何發送命令到串口(JAVA + RXTX) public st ...
- JAVA 串口编程 (三)
四.实例分析 同API一起下载的还有一个examples文件,里面有个最简单的读.写程序,对其进行注释,以增进了理. (1)读串口 1 import java.io.*; 2 import jav ...
- java串口编程-读取称重仪表中净重
一.需求说明 将仪表和计算机串口相连,计算机通过软件向仪表发送指令,然后仪表返回结果,在计算机软件界面上显示. 二.实现过程 1.查看仪表说明书 仪表型号为XK3190-A9,主要是查看相关参数(波特 ...
- java rxtx version_java – 不匹配的RXTX版本
我找到了一个代码,用Java通过串口与Arduino进行通信,并希望尝试使其工作,以便为项目构思扩展它,但我不断收到此错误 Stable Library ======================= ...
- java基于RXTXcomm.jar的串口通信
java基于RXTXcomm.jar的串口通信 RXTX的下载及配置 mfz-rxtx-2.2-20081207-win-x64 下载地址:http://download.csdn.net ...
- 优秀的Java程序员应具备哪些编程技术?
想要成为一名合格的java程序猿,需要学习的知识是有很多的,但是基础知识一定要非常牢固,基础不牢固的程序员,随时都会被新的知识和技术所淘汰,下盘不稳风一吹就倒,那么具体作为一个优秀的Java程序员应具 ...
- java异常对象引用变量_Java面向对象编程-异常处理
第九章 异常处理 异常情况会改变正常的流程,导致恶劣的后果,为了减少损失,应该事先充分预料所有可能出现的异常,然后采取以下措施: 首先考虑避免异常,彻底杜绝异常的发生:如果不能完全避免,则尽可能地减少 ...
最新文章
- java 并行多线程素数,多线程求求1000万内的质数数量
- 2021新年伊始,25岁“天才少年”曹原再发一篇Nature!9个月的第三篇Nature!
- python中的单引号双引号和三引号
- 技术停滞_检测和测试停滞的流– RxJava常见问题解答
- 【软件测试】测试需求分析
- Unity上的Oculus Quest2开发(1) ——首先要空工程能在Quest上跑起来吧
- git 理解 Head指针Branch指针--resetcheckout
- java kernel32.dll,关于kernel32.sys病毒的问题
- Java基础语法总结
- 向量的方向余弦公式_方向余弦矩阵(DCM)简介
- 如何清除远程桌面连接记录
- AJAX初窥门径教程
- [WebView] - WebView leaked
- 那温度 已 无法保留 爱已经 冷透 冷透 我的心 愿 和你共有 一起到 尽头 尽头
- flex 布局
- 第15课:生活中的命令模式——大闸蟹,走起
- 冷战背景下的计算机,袁岚峰:鼓吹科技冷战,格调太低
- 广告传媒----数字营销解决方案
- tinymce富文本编辑框使用
- PostMan测试接口-----上传文件、导出excel