首页 > 其他分享 >jssc库实现读取485串口数据

jssc库实现读取485串口数据

时间:2025-01-02 16:46:04浏览次数:1  
标签:serialPort SerialPort ex 串口 new 485 jssc public SerialPortException

1.添加依赖

点击查看代码
   <dependency>
            <groupId>org.scream3r</groupId>
            <artifactId>jssc</artifactId>
            <version>2.8.0</version>
        </dependency>
2.创建工具类
点击查看代码
package com.pangus.ims.custom.client.lannRay.util;

import jssc.SerialPort;
import jssc.SerialPortException;
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * @program: ims-custom-client-lannray
 * @description: JSSC 库的串口工具类
 * @author: 王帅令
 * @create: 2024-10-16 09:20
 **/

public class SerialPortJSSCUtil {

    private boolean isEventListenerAdded = false;
    public SerialPort serialPort;

    public  SerialPortJSSCUtil(String portName) {
        serialPort = new SerialPort(portName);
    }

    public void openPort(int baudRate, int dataBits, int stopBits, int parity) throws SerialPortException {

        serialPort.openPort();
        serialPort.setParams(baudRate, dataBits, stopBits, parity);

    }

    public void closePort() throws SerialPortException {

        if (serialPort.isOpened()) {
            serialPort.closePort();
        }

    }

    public void writeData(String data) throws SerialPortException {
        serialPort.writeBytes(data.getBytes());
    }

    public void setSerialPortEventListener(SerialPortEventListener listener) throws SerialPortException {
        if (!isEventListenerAdded) {
            serialPort.addEventListener(listener);
            isEventListenerAdded = true;
        }
    }
    public boolean isPortOpened() {
        return serialPort.isOpened();
    }

    public static void main(String[] args) {
        SerialPortJSSCUtil serialUtil = new SerialPortJSSCUtil("COM1");

        try {
            serialUtil.openPort(SerialPort.BAUDRATE_9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

            serialUtil.setSerialPortEventListener(new SerialPortEventListener() {
                @Override
                public void serialEvent(SerialPortEvent event) {
                    if (event.isRXCHAR()) {
                        try {
                            byte[] buffer = serialUtil.serialPort.readBytes(event.getEventValue());
                            System.out.println(new String(buffer));
                        } catch (SerialPortException ex) {
                            ex.printStackTrace();
                        }
                    }
                }
            });

            System.out.println("Serial port opened and listening...");

            // Example of writing data to the serial port
            //serialUtil.writeData("Hello, Serial Port!");

        } catch (SerialPortException ex) {
            ex.printStackTrace();
        } finally {
            try {
                serialUtil.closePort();
            } catch (SerialPortException ex) {
                ex.printStackTrace();
            }
        }
    }
}

3.使用工具类
点击查看代码
/**
     * 读取出口数据数据
     *
     **/
    public void readSerialData() throws IOException {
        try {
            if (!serialPortJSSCUtil.isPortOpened()){
                serialPortJSSCUtil.openPort(SerialPort.BAUDRATE_9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
            }
            serialPortJSSCUtil.setSerialPortEventListener(new SerialPortEventListener() {
                @Override
                public void serialEvent(SerialPortEvent event) {
                    if (event.isRXCHAR()) {
                        try {
                            byte[] buffer = serialPortJSSCUtil.serialPort.readBytes(event.getEventValue());
                            System.out.println(new String(buffer));
                            String RecvStr=new String(buffer);
                          if(!StringUtils.isEmpty(RecvStr)) {
                              ContentBody body=new ContentBody();
                              LinkedHashMap<String, Object> recvData = new LinkedHashMap<>();
                              recvData.put("RecvData",RecvStr);
                              body.setExtendData(recvData);
                              //构建iotBaseMessage
                              final ContentMessage<ContentBody> message = new ContentMessage<>();
                              message.setBody(body);
                              message.setDeviceType(getDeviceType());
                              //发送数据到上层系统
                              sendMessage(message);
                          }
                        } catch (SerialPortException ex) {
                            ex.printStackTrace();
                        }
                    }
                }
            });

        } catch (SerialPortException ex) {
            ex.printStackTrace();
        }
    }

5.将读取方法放入到线程中

点击查看代码
@Override
    public void doWork() {
        try {
            //读串口数据
            readSerialData();
            //加延时
          //  TimeUnit.MINUTES.sleep(10); // 延时10分钟
        } catch (final RemoteNetWorkException ex) {
            throw new DriverException(ex.getMessage(), ex);
        } catch (final DriverException ex) {
            //驱动解析异常,需要人工干预的,直接抛出异常
            throw ex;
        } catch (final Exception ex) {
            //其他异常,例如数据上传到MES,MES返回提示标签不存在的业务类异常,这种也要删原始日志文件
            throw new DriverException(ex.getMessage(), ex);
        }
    }

标签:serialPort,SerialPort,ex,串口,new,485,jssc,public,SerialPortException
From: https://www.cnblogs.com/shuailing/p/18648183

相关文章

  • Arduino串口输出函数print()和write()的联系和区别
    write()传送的是ASCII的十进制的值(如65),而print()传送的是ASCII的文本(如A)1、当参数是字符串时,两者效果相同。因为write()先把字符文本转换成ASCII值,然后转译成ASCII文本,故与print()的效果相同例如:print("abc")和write("abc")都输出:abc       print("123......
  • 串口 RS-485/RS-422 . RS-232 区别/比较/接线图
    串口RS-485/RS-422.RS-232区别/比较/接线图  一、串口接线RS-232:RXD,TXD连线TXD,RXDRS-485: A,B连线A,BRS-422:RX-A,RX-B,TX-A,TX-B 连线 TX-A,TX-B,RX-A,RX-B RS-232 :RXD,TXD连线TXD,RXDRS-485 : A,B连线A,BRS-422......
  • Springboot零件管理系统48580(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,零件信息,零件领用,零件入库,公告信息开题报告内容一、研究背景随着工业化进程的加速和智能制造的兴起,企业对于生产设备及其零件的管理需求日益增强。传统......
  • WinForm通过反射调用dll中的串口传参数并获取返回值
    现有一dll文件MyDll.dll,里边封装了一窗口FormA,现通过FormB调用MyDll.dll中的FormA窗口,传入参数并获取到FormA的返回值(通过FormA中的按钮触发,通过FormB中的委托方法实现返回值)1.MyDll.dll文件中的FormA方法定义委托方法和该委托的事件publicdelegatevoidfrm......
  • 串口DMA配置错误笔记 —— 已解决
    一、DMA发送        1、配置问题        2、发送问题二、DMA接收        1、配置问题        2、接收问题一、DMA发送1、配置问题    使用DMA发送时需要将DMA配置成内存到寄存器搬运,关闭寄存器的地址增长,如果要搬运的多个字......
  • STM32 学习笔记(八)USART串口
    该系列为笔者在学习STM32过程(主线是江科大的视频)中的记录与发散思考。初学难免有所纰漏、错误,还望大家不吝指正,感谢~1.通信接口与串口通信1.1通信接口概述通信接口是用于设备间传输数据的硬件接口。常见的通信接口包括并行接口和串行接口。双工:全双工可以同时接收、发......
  • rfc2217虚拟串口
    记录烧录esp8266的配置.${IDF_PAH}\components\esptool_py\esptool\esptool.py DEFAULT_TIMEOUT=3                  #timeoutformostflashoperationsSTART_FLASH_TIMEOUT=20             #timeoutforstartingflash(mayperfo......
  • HAL库教程:串口+定时器接收不定长数据适用Modbus
    串口接收到的两组数据之间,通常会有一定的时间间隔。我们可以通过判断这个间隔来实现无结束符和无固定长度的串口数据接收功能。当串口在设定的时间内没有接收到新的数据时,认为一组数据已经接收完毕。在一些通信协议中,可能会指定数据之间的间隔时间。例如,Modbus协议要求两组数......
  • 扩展您的串口设备 EU104数据转发芯片可独立设置通讯速率和参数 将1个UART接口扩展为4
    扩展您的串口设备EU104数据转发芯片可独立设置通讯速率和参数将1个UART接口扩展为4个EU104是一款数据转发芯片,具有5个UART接口。它可以将1个UART接口扩展为4个UART接口,主接口的通讯速率可以达到460800bps,子接口的通讯速率最高可达到38400bps。每个接口的通讯速率可以由软件独立......
  • 入门秘籍来啦!串口设计如何避免踩坑?看这篇!
    无论是设计简单的串口通信系统,还是复杂的串口屏应用,掌握这些基础知识都将助你一臂之力。快来动手实践吧,探索串口设计的无限可能!本文将以Air700ECQ/EAQ/EMQ为例,带你从硬件设计的角度,一起来了解串口设计中的一些关键注意点;软件开发或者AT设置方面不做深入探讨。一、串口相关管脚A......