java串口通讯

news/2024/5/20 19:05:03

引maven

<dependency><groupId>com.github.purejavacomm</groupId><artifactId>purejavacomm</artifactId><version>1.0.2.RELEASE</version>
</dependency>

工具类

package com.fx.client.utils;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;import purejavacomm.CommPort;
import purejavacomm.CommPortIdentifier;
import purejavacomm.NoSuchPortException;
import purejavacomm.PortInUseException;
import purejavacomm.SerialPort;
import purejavacomm.SerialPortEventListener;
import purejavacomm.UnsupportedCommOperationException;/*** @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.removeEventListener();serialPort.close();System.out.println("关闭了串口:" + serialPort.getName());}}/*** 向串口发送数据** @param serialPort 串口对象* @param data       发送的数据* @throws IOException */public static void sendData(SerialPort serialPort, byte[] data) throws IOException {OutputStream os = null;try {//获得串口的输出流os = serialPort.getOutputStream();os.write(data);os.flush();//serialPort.} catch (IOException e) {throw e;} finally {try {if (os != null) {os.close();}} catch (IOException e) {e.printStackTrace();}}}/*** 从串口读取数据** @param serialPort 要读取的串口* @return 读取的数据* @throws IOException */public static byte[] readData(SerialPort serialPort) throws IOException {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) {throw e;} finally {try {if (is != null) {is.close();}} catch (IOException e) {e.printStackTrace();}}return bytes;}/*** 给串口设置监听** @param serialPort serialPort 要读取的串口* @param listener   SerialPortEventListener监听对象* @throws TooManyListenersException 监听对象太多* 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));}*/public static void setListenerToSerialPort(SerialPort serialPort, SerialPortEventListener listener) throws TooManyListenersException {//给串口添加事件监听serialPort.addEventListener(listener);//串口有数据监听serialPort.notifyOnDataAvailable(true);//中断事件监听serialPort.notifyOnBreakInterrupt(true);}}

调用

SerialPortUtil.openSerialPort( 端口 getSerialPortList().get(0));SerialPortUtil.setListenerToSerialPort(serialPort, event -> {// 数据通知if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {byte[] bytes;try {bytes = SerialPortUtil.readData(serialPort);baseTestService.readMsg(bytes);} catch (IOException e) {e.printStackTrace();}}});

http://www.mrgr.cn/p/84338285

相关文章

BGP小实验

目录拓扑图环境介绍复盘实验总结配置R3R4R1R2 拓扑图环境介绍每台路由器上都有looback0,比如R4是4.4.4.4/32,直连接口地址为10.1.34.4/24,其他路由器直连和looback口地址类似,R4上还有looback1,地址为44.44.44.44/24。 R3和R4是EBGP邻居关系,AS123内路由器是IBGP邻居关系…

Vue入门到关门之Vue3学习

一、常用API 注意:本文项目均使用脚手架为 Vite 1、setup函数 (1)介绍 如果在项目中使用配置项API,那么写起来就和vue2的写法是一样的;但是如果在项目中写的是组合式API,那么组件中所用到的:数据、方法等等,均要配置在setup中。此外,setup() 钩子也是在组件中使用组合…

线程的常见方法

线程的常见方法 休眠&#xff1a; 让当前状态不再参与cpu的竞争&#xff0c;直到休眠结束&#xff1b; 结果&#xff1a;并不是完全交替进行的&#xff0c;因为只是休眠状态&#xff0c;也会存在争抢cpu 放弃&#xff1a; 让当前状态主动放弃时间片&#xff0c;下次再去争抢…

面试集中营—Redis架构篇

一、Redis到底是多线程还是单线程 1、redis6.0版本之前的单线程&#xff0c;是指网络请求I/O与数据的读写是由一个线程完成的&#xff1b; 2、redis6.0版本升级成了多线程&#xff0c;指的是在网络请求I/O阶段应用的多线程技术&#xff1b;而键值对的读写还是由单线程完成的。所…

sso-单点登录

单点登录 项目组成 基于spring-boot-2.1.8.RELEASE,使用redis完成完成 session记录。sso-basesso-serversso-client1sso-client2 sso-baseTokenFilter: 拦截获取是否登录,并获取登录用户设置到线程变量中TokenUtil:从redis获取指定key判断是否登录,以及登录用户;写入sessi…

Vue入门到关门之Vue2高级用法

一、在vue项目中使用ref属性 ref 属性是 Vue.js 中用于获取对 DOM 元素或组件实例的引用的属性。通过在普通标签上或组件上添加 ref 属性,我们可以在 JavaScript 代码中使用 this.$refs.xxx 来访问对应的 DOM 元素或组件实例。放在普通标签上,通过 this.$refs.名字---》取到的…

Vue入门到关门之Vue3项目创建

一、vue3介绍 1、为什么要学习vue3? vue3的变化: 首先vue3完全兼容vue2,但是vue3不建议用vue2的写法;其次,vue3拥抱TypeScript,之前vue2使用的JavaScript,ts完全兼容js 最后之前学的vue2 是配置项api,而vue3是组合式api optionsAPI(旧) => compositionAPI(新), 效…

LeNet-5上手敲代码

LeNet-5 LeNet-5由Yann LeCun在1998年提出&#xff0c;旨在解决手写数字识别问题&#xff0c;被认为是卷积神经网络的开创性工作之一。该网络是第一个被广泛应用于数字图像识别的神经网络之一&#xff0c;也是深度学习领域的里程碑之一。 LeNet-5的整体架构&#xff1a; 总体…

基于Springboot的校园竞赛管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园竞赛管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

TB交易开拓者旗舰版自动交易的设置

本文针对TB交易开拓者旗舰版V6.0.7.0(期货程序化交易软件下载 - 交易开拓者),目前网上没有自动交易设置的完整教程&#xff0c;特写此篇。 1. 设置期货账户的自动登录和登出。点击菜单“文件/系统设置”&#xff0c;然后在“安全”tab做如下设置&#xff1a; 2 设置你的期货账…

泛域名SSL证书购买攻略!

购买泛域名证书&#xff08;也称为通配符证书&#xff09;通常涉及以下几个步骤&#xff1a; 1. 选择证书提供商&#xff1a; 首先&#xff0c;你需要选择一个信誉良好的SSL证书提供商&#xff0c;如 Sectigo、GlobalSign、DigiCert 或者JoySSL。部分云服务提供商如华为云也提供…

【前端热门框架【vue框架】】——事件处理与表单输入绑定以及学习技巧,让学习如此简单

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;程序员-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

文件IO常用的函数接口

本文归纳整理了常用的文件IO常见的函数接口及其用法,以供读者查阅 目录打开文件fopen关闭文件fclose数据读取字符读取:fgetc、getc、getchar按行读取:fgets、gets按块读取:fread写入文件字符写入:fputc、putc、putchar按行写入:fputs、puts按块写入:fwrite文件位置(光标位…

Android 高版本实现沉浸式状态栏

目前实现的android高版本沉浸式状态栏分为两类&#xff1a; 1、是纯透明状态栏&#xff1b; 2、是纯透明状态栏&#xff0c;但是状态栏字体是黑色&#xff1b; 将状态栏的代码封装到BaseActivity中更方便使用&#xff1a; BaseActivity: public abstract class BaseActivit…

uniapp开发的小程序toast被键盘遮挡提示内容无法完全显示问题解决

文章目录 问题描述问题解决参考链接&#xff1a; 问题描述 在开发抖音小程序后&#xff0c;当用户提交反馈后&#xff0c;调用了系统的toast来显示是否提交成功&#xff0c;结果被系统的键盘给盖住&#xff0c;无法显示完全。 即&#xff0c;简单来说&#xff1a;Toast会被弹…

python教程6.6-发送邮件smtplib

实现步骤: Python对SMTP⽀持有 smtplib 和 email 两个模块, email 负责构造邮件, smtplib 负责发送邮件,它对smtp协议进⾏了简单的封装。 简单代码示例:发送html格式的邮件:在html中插入图片:

PCI-Express-Technology(二)

第一代 PCIe(称为 Gen1 或者 PCIe 协议规范版本 1.x)中,比特率为 2.5GT/s,将它除以 10 即可得知一个通道的速率将可以达到 0.25GB/s。因为链路可以在同一时刻进行发送和接收,因此聚合带宽可以达到这个数值的两倍,即每个通道达到 0.5GB/s。第二代 PCIe(称为 Gen2 或者 PC…

什么是限流?常见的限流算法

目录 1. 什么是限流 2. 常见限流算法 3. 固定窗口算法 4. 滑动窗口算法 5. 漏桶算法 6. 令牌桶算法 7. 限流算法选择 1. 什么是限流 限流&#xff08;Rate Limiting&#xff09;是一种应用程序或系统资源管理的策略&#xff0c;用于控制对某个服务、接口或功能的访问速…

Wireshark CLI | 过滤包含特定字符串的流

问题背景 源自于和朋友的一次技术讨论&#xff0c;关于 Wireshark 如何查找特定字符串所在的 TCP 流&#xff0c;原始问题如下&#xff1a; 仔细琢磨了下&#xff0c;基于我对 Wireshark 的使用经验&#xff0c;感觉一步到位实现比较困难&#xff0c;所以想着说用 Wireshark C…