【Java】基于RXTX的Java串口通信
本篇内容参考转载自https://blog.csdn.net/kong_gu_you_lan/article/details/80589859
环境搭建
下载地址:http://fizzed.com/oss/rxtx-for-java
注意根据你的电脑选择相应的下载包,我的电脑是64位Windows
下载好后把目录中的rxtxParallel.dll和rxtxSerial.dll拷贝到
- JAVA_HOME\jre\bin
RXTXcomm.jar加入工程即可。
基础使用
- public class SerialPortManager {
- /**
- * 查找可用端口
- *
- * @return 可用端口名称列表
- */
- public static final List<String> findPorts() {
- //获得当前所有可用串口
- Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers();
- List<String> ports = new ArrayList<>();
- while (portList.hasMoreElements()) {
- String portName = portList.nextElement().getName();
- ports.add(portName);
- }
- return ports;
- }
- /**
- * 打开串口
- *
- * @param portName 端口名称
- * @param baudrate 波特率
- * @return 串口对象
- * @throws PortInUseException 端口被占用
- */
- public static SerialPort openPort(String portName, int baudrate) throws PortInUseException {
- try {
- //通过端口名识别端口
- CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
- //打开端口,并给端口名字和一个Timeout
- CommPort commPort = portIdentifier.open(portName, 2000);
- //判断是不是串口
- if (commPort instanceof SerialPort) {
- SerialPort serialPort = (SerialPort) commPort;
- try {
- // 设置一下串口的波特率等参数
- // 数据位:8
- // 停止位:1
- // 校验位:None
- serialPort.setSerialPortParams(baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
- SerialPort.PARITY_NONE);
- } catch (UnsupportedCommOperationException e) {
- e.printStackTrace();
- }
- return serialPort;
- }
- } catch (NoSuchPortException e) {
- e.printStackTrace();
- }
- return null;
- }
- /**
- * 关闭串口
- */
- public static void closePort(SerialPort serialPort) {
- if (serialPort != null) {
- serialPort.close();
- }
- }
- /**
- * 发送数据
- *
- * @param serialPort 串口对象
- * @param order 待发送数据
- */
- public static void sendMessageToPort(SerialPort serialPort, byte[] order) {
- OutputStream out = null;
- try {
- out = serialPort.getOutputStream();
- out.write(order);
- out.flush();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- if (out != null) {
- try {
- out.close();
- out = null;
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
- /**
- * 读取数据
- */
- public static byte[] readFromPort(SerialPort serialPort) {
- InputStream in = null;
- byte[] bytes = {};
- try {
- in = serialPort.getInputStream();
- // 缓冲区大小为一个字节
- byte[] readBuffer = new byte[1];
- int bytesNum = in.read(readBuffer);
- while (bytesNum > 0) {
- bytes = ArrayUtils.concat(bytes, readBuffer);
- bytesNum = in.read(readBuffer);
- }
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- if (in != null) {
- in.close();
- in = null;
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return bytes;
- }
- /**
- * 添加监听器
- *
- * @param serialPort 串口对象
- * @param listener 串口存在有效数据监听
- */
- public static void addListener(SerialPort serialPort, DataAvailableListener listener) {
- try {
- // 给串口添加监听器
- serialPort.addEventListener(new SerialPortListener(listener));
- // 设置当有数据到达时唤醒监听接收线程
- serialPort.notifyOnDataAvailable(true);
- // 设置当通信中断时唤醒中断线程
- serialPort.notifyOnBreakInterrupt(true);
- } catch (TooManyListenersException e) {
- e.printStackTrace();
- }
- }
- /**
- * 串口监听
- */
- public static class SerialPortListener implements SerialPortEventListener {
- private DataAvailableListener mDataAvailableListener;
- public SerialPortListener(DataAvailableListener mDataAvailableListener) {
- this.mDataAvailableListener = mDataAvailableListener;
- }
- public void serialEvent(SerialPortEvent serialPortEvent) {
- switch (serialPortEvent.getEventType()) {
- case SerialPortEvent.DATA_AVAILABLE: // 1.串口存在有效数据
- if (mDataAvailableListener != null) {
- mDataAvailableListener.dataAvailable();
- }
- break;
- case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 2.输出缓冲区已清空
- break;
- case SerialPortEvent.CTS: // 3.清除待发送数据
- break;
- case SerialPortEvent.DSR: // 4.待发送数据准备好了
- break;
- case SerialPortEvent.RI: // 5.振铃指示
- break;
- case SerialPortEvent.CD: // 6.载波检测
- break;
- case SerialPortEvent.OE: // 7.溢位(溢出)错误
- break;
- case SerialPortEvent.PE: // 8.奇偶校验错误
- break;
- case SerialPortEvent.FE: // 9.帧错误
- break;
- case SerialPortEvent.BI: // 10.通讯中断
- ShowUtils.errorMessage("与串口设备通讯中断");
- break;
- default:
- break;
- }
- }
- }
- /**
- * 串口存在有效数据监听
- */
- public interface DataAvailableListener {
- /**
- * 串口存在有效数据
- */
- void dataAvailable();
- }
- }
【Java】基于RXTX的Java串口通信的更多相关文章
- (转载)用vs2010开发基于VC++的MFC 串口通信一*****两台电脑同一个串口号之间的通信
此文章以visual C++数据採集与串口通信測控应用实战为參考教程 此文章适合VC++串口通信入门 一.页面布局及加入控件 1, 安装好vs2010如图 2, 新建一个基于VC++的MFC项目com ...
- 使用RXTX获取电脑串口
RXTX是javacomm串口通信的一个扩展 RXTX开发所需文件的下载地址:http://rxtx.qbang.org/wiki/index.php/Download 解压之后可以看到支持各个平台的 ...
- AIR串口通信
最近公司的项目中需要用到串口通信,项目是用基于AIR的,AIR本身是不支持串口通信的,本想用 c#或java另写一个负责串口通信的模块,又感觉很烦不想那么弄,就想到了ANE.可惜以前也没弄过 ANE, ...
- Android串口通信
前段时间因为工作需要研究了一下android的串口通信,网上有很多讲串口通信的文章,我在做的时候也参考了很多文章,现在就将我学习过程中的一些心得分享给大家,希望可以帮助大家在学习的时候少走一些弯路,有 ...
- Java串口通信--------基于RXTX (附带资源地址)
最近帮老师做了一个小项目,一个牧场公司想用传感器收集一些环境信息,记录到数据库里去,然后加以分析查看.这里面和传感器通信用到了串口通信,我也是接触了一下,把用到的东西分享出来. 准备工作: RXTX: ...
- java下的串口通信-RXTX
关于java实现的串口通信,使用的是开源项目RXTX,之前sun公司也有JCL项目,不过已经很久没有更新了,RXTX项目地址:点击打开,但是两个项目的API用法是一样的,只是导入的包不一样而已.简单的 ...
- Java串口通信 RXTX 解决过程
背景介绍: 由于第一次用Java与硬件通信,网上查了许多资料,在这进行整理,便于以后学习.本人串口测试是USB串口设备连接电脑,在设备管理器中找到端口名称(也可以通过一些虚拟串口工具模拟). 下面主要 ...
- 使用Java实现简单串口通信
最近一门课要求编写一个上位机串口通信工具,我基于Java编写了一个带有图形界面的简单串口通信工具,下面详述一下过程,供大家参考 ^_^ 一: 首先,你需要下载一个额外的支持Java串口通信操作的jar ...
- java 串口通信实现流程
1.下载64位rxtx for java 链接:http://fizzed.com/oss/rxtx-for-java 2.下载下来的包解压后按照说明放到JAVA_HOME即JAVA的安装路径下面去 ...
随机推荐
- Django设置session过期时间
settings.py #session 设置 SESSION_COOKIE_AGE = 60 * 10 # 设置过期时间10分钟,默认为两周 SESSION_SAVE_EVERY_REQUEST = ...
- [Codeforces 1228E]Another Filling the Grid(组合数+容斥)
题目链接 解题思路: 容斥一下好久可以得到式子 \(\sum_{i=0}^{n}\sum_{j=0}^{n}(-1)^{i+j}C_n^iC_n^j(k-1)^{ni+nj-ij}k^{n^2-(ni ...
- docker相关----解决tomcat容器启动成功,无法访问的问题
使用docker安装了tomcat镜像,默认为latest最新的(8.5.50版本),依据tomcat镜像创建容器并同时做了端口映射 命令为:docker run --name tomcat01 -d ...
- 在Centos7上安装Oracle
环境: 硬盘30G:2G RAM:Centos7:Oracle 11G: 1.创建组和用户 [zzd@localhost ~]$ su root #切换到root Password: [root@lo ...
- C++基类和派生类的析构函数
1.派生类也不能继承基类的析构函数. 2.与构造函数不同的是,在派生类的析构函数中不用显式地调用基类的析构函数,因为每个类只有一个析构函数,编译器知道如何选择,无需程序员干涉. 3.构造函数和虚构函数 ...
- IntelliJ IDEA 2020 的Debug功能也太好用了,真香!
写在前边 作为一个有点强迫症的程序员来说,所有的应用软件.开发工具都必须要升级到最高版本,否则就会很难受到坐立不安.日思夜想.茶饭不思.至于什么时候得的这种病我也记不清了,哈哈哈 IntelliJ I ...
- C#中? 和 ??的区别
背景 最近在调试C#项目的时候,发现一个比较关于??的特殊用法,当时把我给惊到了,所以特意用这篇短短的笔记来记录一下我的解惑过程: 示例代码: showsomething(isNameNull ?? ...
- Nacos数据模型
Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP. 以上都是nacos官网上面的图片及描述,综合一下 ...
- WeChall_Training: Encodings I (Training, Encoding)
We intercepted this message from one challenger to another, maybe you can find out what they were ta ...
- num04---模板方法模式
最近看书又遇到模板方法模式,具体是在同步器(AQS)的内容上.就顺便再来回顾下. 同步器AbstractQueuedSynchronizer(AQS)是一个抽象类.其中定义了 基本 ...