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 {

    @Autowired
    private 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;

    @Override
    public List<SerialPort> discoverSerialPort() {
        serialPortList = Arrays.asList(SerialPort.getCommPorts());
        // 遍历串口列表并打印每个串口的名称
        for (SerialPort port : serialPortList) {
            System.out.println("获取串口: " + port.getSystemPortName());
        }
        return serialPortList;
    }

    //关闭串口
    @Override
    public 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;
    }


    //发送数据到串口
    @Override
    public void sendData(SerialPort port, String data) throws IOException {
        byte[] buffer2 = ByteUtils.hexStr2Byte(data);
        port.writeBytes(buffer2, buffer2.length);
    }

   
    @Override
    public 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;
    }

    @Override
    public int getListeningEvents() {
        return SerialPort.LISTENING_EVENT_DATA_WRITTEN;
    }

    @SneakyThrows
    @Override
    public 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.kler.cn/a/274280.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录|Day21|回溯01|77.组合

77.组合 组合问题不考虑顺序&#xff0c;例如 [1, 2] 和 [2, 1] 是同一个组合。其中 n 为取数的范围&#xff0c;每个组合包含 k个 元素数量&#xff0c;所以我们嵌套 k 个 for循环 可以很容易写出暴力解法。但如果 k 的值过大&#xff0c;代码将会非常冗长。 我们考虑回溯&…

基于”Python+”多技术融合在蒸散发与植被总初级生产力估算中的应用教程

原文链接&#xff1a;基于”Python”多技术融合在蒸散发与植被总初级生产力估算中的应用教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247598050&idx5&sn70fd3f5946d581ad9c1363295b130ef5&chksmfa823e05cdf5b713baf9cf1381bfb2455ad675a0b21e194…

Unity类银河恶魔城学习记录11-2 p104 Inventoty源代码

此章节相对较难理解&#xff0c;有时间单独出一章讲一下 Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili InventoryItem.cs…

C++ Qt开发:QUdpSocket网络通信组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍如何运用QUdpSocket组件实现基于UDP的网络通信…

Java安全 反序列化(1) URLDNS链原理分析

Java安全 反序列化(1) URLDNS链原理分析 文章目录 Java安全 反序列化(1) URLDNS链原理分析前置知识应用分析payload1.新建HashMap类2.新建URL类3.获取URL 的 Class对象4.通过反射访问URL内部变量5.通过反射为URL中类赋值6.调用HashMap#put方法传入key和value7.再次通过反射为UR…

基于51单片机PT100温度检测LCD1602显示(程序+原理图+PCB+仿真+全套资料)

功能介绍&#xff1a;采用51单片机和MAX13865模块PT100传感器LCD1602显示屏&#xff0c;通过PT100传感器感知稳定&#xff0c;MAX13865模块进行转换&#xff0c;采用SPI协议和单片机进行通信&#xff0c;将温度传送到单片机&#xff0c;然后单片机将数据显示到LCD1602屏幕上。 …

ModbusTCP转Profinet网关高低字节交换切换

背景&#xff1a;在现场设备与设备通迅之间通常涉及到从一种字节序&#xff08;大端或小端&#xff09;转换到另一种字节序。大端字节序是指高位字节存储在高地址处&#xff0c;而小端字节序是指低位字节存储在低地址处。在不动原有程序而又不想或不能添加程序下可选用ModbusTC…

深入探讨Python中的文件操作与文件IO操作【第141篇—Python实现】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 深入探讨Python中的文件操作与文件IO操作 在Python编程中&#xff0c;文件操作和文件IO操作…

【Swing】Java Swing实现省市区选择编辑器

【Swing】Java Swing实现省市区选择编辑器 1.需求描述2.需求实现3.效果展示 系统&#xff1a;Win10 JDK&#xff1a;1.8.0_351 IDEA&#xff1a;2022.3.3 1.需求描述 在公司的一个 Swing 的项目上需要实现一个选择省市区的编辑器&#xff0c;这还是第一次做这种编辑器&#xf…

第四百一十一回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"给geolocator插件提交问题的结果"相关的内容&#xff0c;本章回中将介绍自定义标题栏.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我…

Java基础-IO流

文章目录 1.文件1.基本介绍2.常用的文件操作1.创建文件的相关构造器和方法代码实例结果 2.获取文件相关信息代码实例结果 3.目录的删除和文件删除代码实例 2.IO流原理及分类IO流原理IO流分类 3.FileInputStream1.类图2.代码实例3.结果 4.FileOutputStream1.类图2.案例代码实例 …

全国农产品价格分析预测可视化系统设计与实现

全国农产品价格分析预测可视化系统设计与实现 【摘要】在当今信息化社会&#xff0c;数据的可视化已成为决策和分析的重要工具。尤其是在农业领域&#xff0c;了解和预测农产品价格趋势对于农民、政府和相关企业都至关重要。为了满足这一需求&#xff0c;设计并实现了全国农产…

Apache SeaTunnel MongoDB CDC 使用指南

随着数据驱动决策的重要性日益凸显&#xff0c;实时数据处理成为企业竞争力的关键。SeaTunnel MongoDB CDC(Change Data Capture) 源连接器的推出&#xff0c;为开发者提供了一个高效、灵活的工具&#xff0c;以实现对 MongoDB 数据库变更的实时捕获和处理。 本文将深入探讨该连…

3月19日做题

[NPUCTF2020]验证&#x1f40e; if (first && second && first.length second.length && first!second && md5(firstkeys[0]) md5(secondkeys[0]))用数组绕过first1&second[1] 这里正则规律过滤位(Math.) (?:Math(?:\.\w)?) : 匹配 …

详解命令docker run -d --name container_name -e TZ=Asia/Shanghai your_image

docker run 是Docker的主要命令&#xff0c;用于从镜像启动一个新的容器。下面详细解释并举例说明 -d, --name, -e TZ 参数的用法&#xff1a; -d 或 --detach&#xff1a; 这个标志告诉Docker以守护进程&#xff08;后台&#xff09;模式运行容器。这意味着当你执行 docker ru…

②免费AI软件开发工具测评:通义灵码 VS 码上飞

前言 我又双叒叕来测评了&#xff01;上次给大家带来的是iFlyCode和CodeFlying两款产品的测评&#xff0c;受到了大家的一致好评~ 今天咱就继续来聊聊&#xff0c;这次我们选的的对象是通义灵码和码上飞&#xff0c;从名字上也能看到出来这两款产品一定是跟软件开发有关系的&…

IPD集成产品开发:塑造企业未来竞争力的关键

随着市场竞争的日益激烈&#xff0c;企业对产品开发的要求也越来越高。如何在快速变化的市场环境中&#xff0c;既保证产品的批量生产效率&#xff0c;又满足客户的个性化需求&#xff0c;成为了企业面临的重要挑战。IPD&#xff08;集成产品开发&#xff09;模式&#xff0c;作…

Linux 常用操作命令大全

目录 一、命令大集合 1.1 whereis 1.2 which 1.3 sudo 1.4 grep 1.5 free 1.6 top 动态显示进程的状态 1.7 ps 静态显示进程信息 1.8 df 1.9 iostat 看IO性能状态 1.10 yum安装插件命令 1.11 rpm 1.12 scp远程拷贝 1.13 uname 二、linux网络命令 2.1 centos7 防火…

理论学习:with torch.no_grad()

如果不加上“with torch.no_grad():”&#xff0c;模型参数会发生改变吗&#xff1f; 如果不使用with torch.no_grad():&#xff0c;在进行模型推理&#xff08;即计算outputs_cls net(inputs[batch_size//2:])这一步&#xff09;时&#xff0c;模型参数不会发生改变&#xf…

#Ubuntu(修改root信息)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;命令行终端&#xff1a; a.右键&#xff0c;open terminal b.快捷键 ctrlaltt &#xff08;2&#xff09;进行root修改 sudo passwd &a…
最新文章