JAVA串口通信 发送失败重连

一、技术引用

使用com.fazecast.jSerialComm Jar包

二、代码实现

1、串口实现类

package com.handler;

import com.fazecast.jSerialComm.SerialPort;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

//专用电缆绝缘串口
@Data
@Slf4j
public class NewSerialHandler {
    private SerialPort serialPort;
    private static NewSerialHandler newSerialHandler;

    //私有化方法
    private NewSerialHandler(String portName, Integer baudRate, Integer dataBits, Integer stopBits){
        try{
            this.serialPort = SerialPort.getCommPort(portName);
        }catch (Exception e){
            e.printStackTrace();
        }

        serialPort.setParity(SerialPort.NO_PARITY);
        serialPort.setBaudRate(baudRate);
        serialPort.setNumDataBits(dataBits);
        serialPort.setNumStopBits(stopBits);
    }

    //初始化
    public static NewSerialHandler getInstance(String portName, Integer baudRate, Integer dataBits, Integer stopBits){
        if(newSerialHandler != null){
            return newSerialHandler;
        }
        synchronized (NewSerialHandler.class){
            if(newSerialHandler != null){
                return newSerialHandler;
            }
            newSerialHandler = new NewSerialHandler(portName, baudRate, dataBits, stopBits);
            log.info("create success");
            return newSerialHandler;
        }
    }

    //打开端口
    public boolean openPort(){
        return serialPort.openPort();
    }

//发送数据
    public boolean sendBytes(byte[] bytes){
        int result = serialPort.writeBytes(bytes, bytes.length);
        return result > 0;
    }

    //关闭端口
    public boolean closePort(){
        return serialPort.closePort();
    }

    //判断端口是否打开
    public boolean isOpen(){
        return serialPort.isOpen();
    }


}

2.使用

private NewSerialHandler newSerialHandler = null; //声明

//初始化串口类
private synchronized void initNewSerialHandler(){
        if(Objects.isNull(newSerialHandler)){
            try{
                newSerialHandler = NewSerialHandler.getInstance(serialConfig.getName(), serialConfig.getBaudRate(), serialConfig.getDataBits(), serialConfig.getStopBits());
                newSerialHandler.openPort();
            }catch (Exception e){
                log.error("serial connect fail:", e);
                newSerialHandler = null;
            }
        }
    }

//发送消息
public void sendMsg(String msg){
    byte[] bytes = msg.getBytes();
    boolean result = newSerialHandler.sendBytes(datas);
    //发送失败重联
    if(!result){
        log.error("send fail;{}", s);
        if(newSerialHandler.isOpen()){
            newSerialHandler.closePort();
        }
        if(!newSerialHandler.isOpen()){
            newSerialHandler.openPort();
        }
    }

}

注意事项:

如果运行JVM是64位,则可使用最新jSerialComm包

MAVEN引用

<dependency>
  <groupId>com.fazecast</groupId>
  <artifactId>jSerialComm</artifactId>
  <version>[2.0.0,3.0.0)</version>
</dependency>

如果运行JVM是32位,则需要下载JAR包手动引用到项目中,然后再MAVEN打包加入。JAR包下载地址:链接: https://pan.baidu.com/s/1dS_FTxRGZgrNpOnb_JtSwA 提取码: 7rgd 

<dependency>
            <groupId>com.fazecast</groupId>
            <artifactId>jSerialComm</artifactId>
            <version>2.11.1</version>
            <!--system,类似provided,需要显式提供依赖的jar以后,Maven就不会在Repository中查找它-->
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/jSerialComm-2.11.1.jar</systemPath>
 </dependency>

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <includeSystemScope>true</includeSystemScope>
                </configuration>
            </plugin>
        </plugins>
</build>

jSerialComm 是一个Java串口通信库,可以通过该库来实现串口通信的功能。如果需要在多线程环境下使用jSerialComm,可以考虑使用Java的多线程机制。 以下是使用jSerialComm实现多线程串口通信的示例代码: ```java import com.fazecast.jSerialComm.SerialPort; public class SerialCommThread extends Thread { private SerialPort serialPort; private boolean running; public SerialCommThread(SerialPort serialPort) { this.serialPort = serialPort; this.running = false; } public void run() { running = true; while (running) { // 读取串口数据 byte[] buffer = new byte[1024]; int numBytes = serialPort.readBytes(buffer, buffer.length); // 处理数据 if (numBytes > 0) { String message = new String(buffer, 0, numBytes); System.out.println(message); } } } public void stopThread() { running = false; } } public class Main { public static void main(String[] args) { SerialPort serialPort = SerialPort.getCommPort("/dev/ttyACM0"); serialPort.openPort(); serialPort.setBaudRate(9600); SerialCommThread thread = new SerialCommThread(serialPort); thread.start(); // 在主线程中发送串口数据 byte[] buffer = "Hello, world!".getBytes(); serialPort.writeBytes(buffer, buffer.length); // 在主线程中等待一段时间,然后停止串口线程 try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } thread.stopThread(); serialPort.closePort(); } } ``` 在这个例子中,SerialCommThread类继承了Thread类,实现了一个串口通信的线程。在run方法中,使用serialPort.readBytes方法读取串口数据,并进行处理。stopThread方法用于停止线程。 在主线程中,创建一个SerialCommThread对象,并启动线程。然后使用serialPort.writeBytes方法向串口发送数据。在一定时间后,调用thread.stopThread方法停止串口线程,并使用serialPort.closePort方法关闭串口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值