由于项目之前用的串口工具RXTX只支持到jdk1.8 然后项目目前用到的jdk是13的 所以在网上找了一下 找到了这个 jSerialComm 目前使用是支持13及1.8的 没做其它jdk版本测试
引入jar包,github地址:http://fazecast.github.io/jSerialComm/
<!--http://fazecast.github.io/jSerialComm/-->
<!--串口连接工具-->
<dependency>
<groupId>com.fazecast</groupId>
<artifactId>jSerialComm</artifactId>
<version>\[2.0.0,3.0.0)</version>
</dependency>
连接工具api文档地址:com.fazecast.jSerialComm (jSerialComm 2.9.0 API)
串口操作:
package com.jinfu.core; import com.fazecast.jSerialComm.SerialPort; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors;
@Slf4j public class SerialPortManager { //查找所有可用端口
public static List<String> findPorts() { // 获得当前所有可用串口
SerialPort\[\] serialPorts = SerialPort.getCommPorts();
List<String> portNameList = new ArrayList<String>(); // 将可用串口名添加到List并返回该List
for(SerialPort serialPort:serialPorts) {
portNameList.add(serialPort.getSystemPortName());
} //去重
portNameList = portNameList.stream().distinct().collect(Collectors.toList()); return portNameList;
} /** \* 打开串口
\*
\* @param portName 端口名称
\* @param baudRate 波特率
\* @return 串口对象 */
public static SerialPort openPort(String portName, Integer baudRate) {
SerialPort serialPort = SerialPort.getCommPort(portName); if (baudRate != null) {
serialPort.setBaudRate(baudRate);
} if (!serialPort.isOpen()) {
//开启串口
serialPort.openPort(1000);
}else{ return serialPort;
} // 设置一下串口的波特率等参数 // 数据位:8 // 停止位:1 // 校验位:None
serialPort.setFlowControl(SerialPort.FLOW_CONTROL_DISABLED);
serialPort.setComPortParameters(baudRate, 8, SerialPort.ONE\_STOP\_BIT, SerialPort.NO_PARITY);
serialPort.setComPortTimeouts(SerialPort.TIMEOUT\_READ\_BLOCKING | SerialPort.TIMEOUT\_WRITE\_BLOCKING, 1000, 1000); return serialPort;
} /** \* 关闭串口
\* @param serialPort 待关闭的串口对象 */
public static void closePort(SerialPort serialPort) { if (serialPort != null && serialPort.isOpen()){
serialPort.closePort();
}
} /** \* 往串口发送数据
\* @param serialPort 串口对象
\* @param content 待发送数据 */
public static void sendToPort(SerialPort serialPort,byte\[\] content) { if (!serialPort.isOpen()) { return;
}
serialPort.writeBytes(content, content.length);
} /** \* 从串口读取数据
\* @param serialPort 当前已建立连接的SerialPort对象
\* @return 读取到的数据 */
public static byte\[\] readFromPort(SerialPort serialPort) { byte\[\] reslutData = null; try { if (!serialPort.isOpen()){return null;}; int i=0; while (serialPort.bytesAvailable() > 0 && i++ < 5) Thread.sleep(20); byte\[\] readBuffer = new byte\[serialPort.bytesAvailable()\]; int numRead = serialPort.readBytes(readBuffer, readBuffer.length); if (numRead > 0) {
reslutData = readBuffer;
}
} catch (InterruptedException e) {
e.printStackTrace();
} return reslutData;
} /** \* 添加监听器
\* @param serialPort 串口对象
\* @param listener 串口存在有效数据监听 */
public static void addListener(SerialPort serialPort, DataAvailableListener listener) { try { // 给串口添加监听器
serialPort.addDataListener(new SerialPortListener(listener));
} catch (Exception e) {
e.printStackTrace();
}
}
}
当前串口工具是自带一个监听的方法SerialPortDataListener
目前是写了一个回调来监听串口工具的监听方法 这样做 是为了混淆 混淆后 串口工具自带的监听方法无法被其它地方调用
监听:
import com.fazecast.jSerialComm.SerialPort; import com.fazecast.jSerialComm.SerialPortDataListener; import com.fazecast.jSerialComm.SerialPortEvent; import lombok.extern.slf4j.Slf4j; /* * 串口监听 / @Slf4j public class SerialPortListener implements SerialPortDataListener { private DataAvailableListener mDataAvailableListener; public SerialPortListener(DataAvailableListener mDataAvailableListener) { this.mDataAvailableListener = mDataAvailableListener;
}
@Override public int getListeningEvents() {
//必须是return这个才会开启串口工具的监听 return SerialPort.LISTENING_EVENT_DATA_AVAILABLE;
} public void serialEvent(SerialPortEvent serialPortEvent) { if (mDataAvailableListener != null) {
mDataAvailableListener.dataAvailable();
}
}
}
/**
\* 串口存在有效数据监听
*/
public interface DataAvailableListener {
/\*\*
\* 串口存在有效数据
*/
void dataAvailable();
}
调用示例:
/* * @throws PortInUseException 串口已经被占用 /
public static void main(String\[\] args) throws PortInUseException {//打开串口,返回一个串口对象 参数:串口号 波特率
SerialPort serialPort = SerialPortManager.openPort("COM1", 10000); //给当前串口对象设置监听器
SerialPortManager.addListener(serialPort, new DataAvailableListener() {
@Override public void dataAvailable() { //当前监听器监听到的串口返回数据 back
byte\[\] back = SerialPortManager.readFromPort(serialPort); }
}); //当前向串口发送的数据(模拟假数据)
byte\[\] content = new byte\[10\]; //向当前串口发送数据
SerialPortManager.sendToPort(serialPort,content);
}
当前项目只针对一个设备 所以监听也是做的针对一个串口对象
目前有个小问题 当串口已经开启后 在去开启串口会提示串口开启失败 同时之前开启的串口无法再次开启除非关闭后才能再次开启 目前做的一个小处理就是在开启的时候先将当前连接上串口关闭 然后再重新开启
原网址: 访问
创建于: 2023-11-14 10:03:29
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论