SpringBoot项目串口通讯之jSerialComm

目录

  • 1.pom坐标
  • 2.控制层
  • 3.接口
  • 4.实现类-通过串口向设备发数据
  • 5.监听设备通过串口返回数据
  • 6.创建响应结果类ResponseResult

1.pom坐标

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version><relativePath/> </parent><groupId>com.example</groupId><artifactId>rxtxcommon</artifactId><version>0.0.1-SNAPSHOT</version><name>rxtxcommon</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency><!--websocket--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version><scope>provided</scope></dependency><!--jSerialComm库串口通讯--><dependency><groupId>com.fazecast</groupId><artifactId>jSerialComm</artifactId><version>2.6.2</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

2.控制层

import com.fazecast.jSerialComm.SerialPort;
import com.example.rxtxcommon.entity.ResponseResult;
import com.example.rxtxcommon.service.SerialPortService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.socket.WebSocketSession;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;@RestController
@RequestMapping("/serial")
public class SerialController {@Autowiredprivate SerialPortService serialPortService;public List<SerialPort> serialPortList;public int countsend;public int countreceive;@GetMapping("/discover")public ResponseResult<List<String>> discoverSerialPort() {List<SerialPort> list1 = serialPortService.discoverSerialPort();List<String> list = new ArrayList<>();serialPortList = list1;list1.forEach(item -> {list.add(item.getSystemPortName());});ResponseResult<List<String>> response = new ResponseResult<>(list.size() == 0 ? 500 : 1, "", list);return response;}@GetMapping("/open")public ResponseResult<Boolean> openSerialPort(SerialPort port1) {WebSocketSession session = null;for (SerialPort port : serialPortList) {if (port.getSystemPortName().equals("COM10")) {return serialPortService.openSerialPort(port, session);}}return ResponseResult.getErrorResult("Failed to find port ");}@GetMapping("/send")public String sendData(SerialPort port1, String data) throws IOException {//发送数据注意,提前与接收设备沟通好协议,发送什么样类型的数据设备才可以进行响应,否则设备无响应for (SerialPort port : serialPortList) {if (port.getSystemPortName().equals("COM10")) {serialPortService.sendData(port, data);}}return "Data sent>>>" + (countsend++);}@GetMapping("/close")public String closeSerialPort(SerialPort port1) {for (SerialPort port : serialPortList) {// 遍历串口列表并为每个串口设置参数serialPortService.closeSerialPort(port);}return "Serial port closed";}}

3.接口

import com.fazecast.jSerialComm.SerialPort;
import com.example.rxtxcommon.entity.ResponseResult;
import org.springframework.web.socket.WebSocketSession;import java.io.IOException;
import java.util.List;public interface SerialPortService {List<SerialPort> discoverSerialPort();boolean closeSerialPort(SerialPort port);void sendData(SerialPort port, String data) throws IOException;ResponseResult<Boolean> openSerialPort(SerialPort port, WebSocketSession session);
}

4.实现类-通过串口向设备发数据

import com.fazecast.jSerialComm.SerialPort;
import com.example.rxtxcommon.config.DataListener;
import com.example.rxtxcommon.entity.ResponseResult;
import com.example.rxtxcommon.service.SerialPortService;
import com.example.rxtxcommon.utils.ByteUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.socket.WebSocketSession;import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;@Service
public class SerialPortServiceImp implements SerialPortService {public List<SerialPort> serialPortList;@Overridepublic List<SerialPort> discoverSerialPort() {serialPortList = Arrays.asList(SerialPort.getCommPorts());// 遍历串口列表并打印每个串口的名称for (SerialPort port : serialPortList) {System.out.println("获取串口: " + port.getSystemPortName());}return serialPortList;}//关闭串口@Overridepublic boolean closeSerialPort(SerialPort port) {for (SerialPort portItem : serialPortList) {if (portItem.getSystemPortName().equals("COM10")) {if (portItem != null) {System.out.println("断开端口" + portItem.getSystemPortName() + "连接");return portItem.closePort();}}}return false;}//发送数据到串口@Overridepublic void sendData(SerialPort port, String data) throws IOException {byte[] buffer2 = ByteUtils.hexStr2Byte(data);port.writeBytes(buffer2, buffer2.length);}@Overridepublic ResponseResult<Boolean> openSerialPort(SerialPort port, WebSocketSession session) {if (port.getSystemPortName().equals("COM10")) {int baudRate = 2400; // 波特率int parity = SerialPort.EVEN_PARITY; // 校验位int dataBits = 8; // 数据位int stopBits = SerialPort.ONE_STOP_BIT; // 停止位if (port.openPort()) {try {boolean setComResult = port.setComPortParameters(baudRate, dataBits, stopBits, parity); // 设置参数boolean setComTimes = port.setComPortTimeouts(SerialPort.TIMEOUT_READ_SEMI_BLOCKING, 20000, 0); // 设置超时if (setComResult && setComTimes) {port.addDataListener(new DataListener(port.getSystemPortName(), session));}} catch (Exception e) {e.printStackTrace();return ResponseResult.getErrorResult("Failed to open port " + port.getSystemPortName() + e.getMessage().toString());}System.out.println("COM10 Serial port open 打开");return ResponseResult.getSuccessResult("COM10 Serial port open");} else {return ResponseResult.getErrorResult("Failed to open port " + port.getSystemPortName());}}return ResponseResult.getErrorResult("Failed to find port " + port.getSystemPortName());}}

5.监听设备通过串口返回数据

import com.fazecast.jSerialComm.SerialPort;
import com.fazecast.jSerialComm.SerialPortDataListener;
import com.fazecast.jSerialComm.SerialPortEvent;
import com.example.rxtxcommon.utils.ByteUtils;
import lombok.SneakyThrows;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;public class DataListener implements SerialPortDataListener {private WebSocketSession session;private String portName;//通过websocket打开监听设备的时候绑定session返回给前端数据public DataListener(String portName, WebSocketSession session) {this.portName = portName;this.session = session;}@Overridepublic int getListeningEvents() {return SerialPort.LISTENING_EVENT_DATA_WRITTEN;}@SneakyThrows@Overridepublic void serialEvent(SerialPortEvent event) {String hexString = "";if (event.getEventType() == SerialPort.LISTENING_EVENT_DATA_WRITTEN) {byte[] newData = new byte[event.getSerialPort().bytesAvailable()];int numRead = event.getSerialPort().readBytes(newData, newData.length);hexString = ByteUtils.byteArrayToHexString(newData);}System.out.println("监听接收串口" + portName + ";数据:" + hexString);session.sendMessage(new TextMessage(hexString));}
}

6.创建响应结果类ResponseResult

import lombok.Data;
import java.io.Serializable;@Data
public class ResponseResult<T> implements Serializable {/*** responseCode : 成功默认为1*/public static final int CODE_SUCCESS = 1;/*** responseCode : 失败默认为500*/public static final int CODE_ERROR = 500;private Integer code;private String message;private T data;public ResponseResult(Integer code, String message, T data) {this.code = code;this.message = message;this.data = data;}public ResponseResult(Integer code, String message) {this.code = code;this.message = message;this.data = data;}public static <T> ResponseResult<T> getSuccessResult(String message, T data) {return new ResponseResult<>(CODE_SUCCESS, message, data);}public static <T> ResponseResult<T> getSuccessResult(String message) {return new ResponseResult<>(CODE_SUCCESS, message);}public static <T> ResponseResult<T> getErrorResult(String message) {return new ResponseResult<>(CODE_ERROR, message);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/743773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【青书学堂】2024年第一学期 程序设计基础(高起专) 作业

【青书学堂】2024年第一学期 程序设计基础(高起专) 作业 为了方便日后复习&#xff0c;青书学堂成人大专试题整理。 若有未整理的课程&#xff0c;请私信我补充&#xff0c;欢迎爱学习的同学们收藏点赞关注&#xff01;文章内容仅限学习使用&#xff01;&#xff01;&#xff0…

基于FPGA的OV7725摄像头的HDMI显示(含源码)

1、概述 本文FPGA通过SCCB接口初始化OV7725摄像头寄存器&#xff0c;然后采集OV7725的摄像头数据&#xff0c;使用DDR3对数据进行暂存&#xff0c;最后将数据输出到HDMI显示器上进行显示。 该工程对应系统框图如下所示&#xff0c;主要包含OV7725驱动及数据处理模块、DDR3读写控…

CSS概念及入门

CSS概念及入门 简介 CSS 的全称为&#xff1a;层叠样式表 ( Cascading Style Sheets ) 。 CSS 也是一种标记语言&#xff0c;用于给 HTML 结构设置样式&#xff0c;例如&#xff1a;文字大小、颜色、元素宽高等等。 主流的布局方式:divcss。 组成 选择器 用于选择页面中的…

springboot混用RedisTemplate(lettuce、jedis)和Redisson客户端

手打不易&#xff0c;如果转摘&#xff0c;请注明出处&#xff01; 注明原文&#xff1a;https://zhangxiaofan.blog.csdn.net/article/details/136679352 redis常用的三大客户端&#xff1a;lettuce、jedis、redisson 一般都是 lettuce redisson&#xff08;推荐&#xff0…

防御安全(IPSec实验)

目录 需求&#xff1a; pc1 ping通 pc2 ,使用IPSec VPN 拓扑图&#xff1a; ​编辑实验配置&#xff1a; 注意&#xff1a; 直接在路由器r1和r2分别配置即可&#xff0c;路由器r1和r2要写一条缺省指向ISP 实验配置截图如下&#xff1a; 2. r1​编辑 3. r3​编辑 3.r…

工业互联网的安全策略及发展趋势——青创智通

工业物联网解决方案-工业IOT-青创智通 随着科技的不断发展&#xff0c;工业互联网作为工业与互联网的结合体&#xff0c;正日益成为推动工业转型升级的重要力量。然而&#xff0c;伴随着工业互联网的广泛应用&#xff0c;其安全问题也日益凸显。本文将从工业互联网的安全性角度…

Node.js_会话控制

介绍 HTTP是一种无状态的协议,没有办法区分多次的请求是否来自同一客户端,无法区分用户身份,需要通过会话控制来解决该问题 会话控制技术 cookie: 按照域名分别保存,默认在关闭浏览器的时候数据消失,可以通过第三个参数设置有效期。运行流程:浏览器向服务器发送请求时…

Go——数组

Golang Array和以往认知的数组有很大的。 数组是同一种数据类型的固定长度的序列。数组定义&#xff1a;var a[len] int&#xff0c;比如&#xff1a;var a [5]int&#xff0c;数组长度必须是常量&#xff0c;且类型的组成部分。一旦定义&#xff0c;长度不能变。长度是数组类…

认识Testbench仿真激励

一、认识Testbench Bench有平台之意&#xff0c;所以Testbench就是测试平台的意思。 任何一个被测模块&#xff0c;都有输入和输出&#xff0c;此模块是否合格的判断依据&#xff0c;就是在满足输入要求的情况下&#xff0c;能否得到符合预期的输出。我们把被测模块称作UUT&…

docker镜像ssh服务

基于commit命令实现 首先我们是基于Ubuntu:18.04版本做ssh服务&#xff0c;拉取镜像 [rootmaster ~]# docker pull ubuntu:18.04 [rootmaster ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 18.04 f9a80a5…

Kafka问题纪要

1. 取 如何获取 topic 主题的列表 bin/kafka-topics.sh --list --zookeeper localhost:2181 2. 生产者和消费者的命令行是什么&#xff1f; 生产者在主题上发布消息&#xff1a; bin/kafka-console-producer.sh --broker-list 192.168.43.49:9092 --topicHello-Kafka 注意这…

vue3 el-form中嵌套el-tabale 对输入动态校验

简单案例 <el-form :model"Form" :rules"rules" ref"FormRef" class"formDiv"><el-table :data"Form.copyWriters" style"width: 100%"><el-table-column label"文案链接"><temp…

rancher是什么

Rancher Labs是制作Rancher的公司。Rancher Labs成立于2014年&#xff0c;是一家专注于企业级容器管理软件的公司。它的产品设计旨在简化在分布式环境中部署和管理容器的过程&#xff0c;帮助企业轻松地采用容器技术和Kubernetes。Rancher Labs提供的Rancher平台支持Docker容器…

H5 简单四按钮个人主页源码

源码名称&#xff1a;简单四按钮个人主页源码 源码介绍&#xff1a;一款简单的带4个按钮选项的个人主页源码&#xff0c;可自行修改内容作为自己的个人主页。 需求环境&#xff1a;H5 下载地址&#xff1a; https://www.changyouzuhao.cn/11458.html

DeepMind推出SIMA:一款在3D虚拟环境中展现强大泛化能力的通用AI代理

【技术框架概述】: SIMA(Scalable Instructable Multiworld Agent)是一种通用的 AI 代理系统,旨在在多种视频游戏环境中执行任务,并能够通过自然语言指令进行操作。它包含了预先训练的视觉模型和主模型,可以使用键盘和鼠标操作游戏中的角色。 【定位】:SIMA的定位是成…

ubuntu 23.04 安装 中文输入法

1、安装 fcitx sudo apt install fcitxfcitx 安装好后&#xff0c;可以使用 fcitx-configtool 命令进行配置&#xff0c;其界面如下所示。在这里可以配置不同输入法的切换快捷键&#xff0c;默认输入法等。刚安装系统后&#xff0c;这里只有一个输入法&#xff0c;所以接下来要…

Mysql将datetime数据转为Data/Char

打印当前日期&#xff1a; SELECT NOW();datetime转Date SELECT CONVERT(NOW(), DATE);datetime转字符 SELECT CONVERT(NOW(),char);datetime直接转日期格式的字符 方法1&#xff1a; SELECT CONCAT(CONVERT (Now(), DATE), "");方法2&#xff1a; SELECT DATE_…

元宇宙崛起:区块链与金融科技共绘数字新世界

文章目录 一、引言二、元宇宙与区块链的深度融合三、区块链在元宇宙金融中的应用四、金融科技在元宇宙中的创新应用五、面临的挑战与机遇《区块链与金融科技》亮点内容简介获取方式 一、引言 随着科技的飞速发展&#xff0c;元宇宙概念逐渐走进人们的视野&#xff0c;成为数字…

C语言入门到精通之练习54:猴子吃桃问题(附带源码)

一只小猴子一天摘了许多桃子&#xff0c;第一天吃了一半&#xff0c;然后忍不住又吃了一个&#xff1b;第二天又吃了一半&#xff0c;再加上一个&#xff1b;后面每天都是这样吃。到第10天的时候&#xff0c;小猴子发现只有一个桃子了。问小猴子第一天共摘了多少个桃子。 实例…

先进电气技术 —— 片上宽禁带器件的集成与应用

一、背景 功率转换器设计的一个关键目标是降低功率损耗以提高转换效率&#xff0c;这对可再生能源等应用产生影响。通过降低功率损耗&#xff0c;可以减小变换器元件的尺寸&#xff0c;从而使整个变换器的尺寸更小。因此&#xff0c;转换器的大小和成本完全取决于设计要求和应…