java调用串口modbus重连踩坑记

 

 

故事背景:

我们在项目中有一些采集数据的需求,在实现的时候我们实现了一些驱动来进行不同通信协议的适配,包括modbus,TCP等通信协议。在串口modbus(serialModbus)采集过程中,我们发现重新连接一直失败。通过我的研究发现,在jssc中,串口通信并不需要手动进行重连,因此删除了重连代码解决了问题。为了证明串口通信无需重连并且查找重连失败的原因,做了以下记录。

jar包使用:

jamod-2.0.0-SNAPSHOT.jar:这边我们对网络上的jar包进行了挑选,选择了可以使用的,加入我们的maven私服,版本号定位2.0.0.

jssc:jssc-2.6.2.jar:这个版本目前maven服务器中好像也没有,不过没有进行尝试,最新版可能也可以使用。

jssc中连接失败的原因:

关闭端口实现原理

以下为jssc中关闭端口的代码:

public boolean closePort() throws SerialPortException {
    this.checkPortOpened("closePort()");
    if (this.eventListenerAdded) {
        this.removeEventListener();
    }
    boolean returnValue = this.serialInterface.closePort(this.portHandle);
    if (returnValue) {
        this.maskAssigned = false;
        this.portOpened = false;
    }
    return returnValue;
}

可以看出关闭接口一共做了两件事:

  1. 移出listener
  2. 调用this.serialInterface的关闭功能。

打开端口实现原理

public boolean openPort() throws SerialPortException {
    if (this.portOpened) {
        throw new SerialPortException(this.portName, "openPort()", "Port already opened");
    } else if (this.portName == null) {
        throw new SerialPortException(this.portName, "openPort()", "Null not permitted");
    } else {
        boolean useTIOCEXCL = System.getProperty("JSSC_NO_TIOCEXCL") == null && System.getProperty("JSSC_NO_TIOCEXCL".toLowerCase()) == null;
        this.portHandle = this.serialInterface.openPort(this.portName, useTIOCEXCL);
        i
### 实现 Modbus RTU 协议连接 COM1 串口 为了使用 Java 和 `easymodbus4j` 库实现 Modbus RTU 连接 COM1 串口,需要按照以下方式构建应用程序: #### 添加 Maven 依赖项 首先,在项目的 pom.xml 文件中添加 `easymodbus4j` 的 Maven 依赖项[^4]。 ```xml <dependency> <groupId>com.github.zengfr</groupId> <artifactId>easymodbus4j</artifactId> <version>0.0.1</version> </dependency> ``` #### 初始化串口通信参数设置 定义并初始化用于配置串行端口的对象。这通常涉及指定波特率、数据位、停止位以及校验模式等参数[^3]。 ```java import com.deltamon.easymodbus.Modbus; import com.deltamon.easymodbus.exceptions.ConnectionException; public class ModbusRTUSerialExample { public static void main(String[] args) throws ConnectionException { String portName = "COM1"; // 定义要使用的串口号 int baudRate = 9600; // 设置波特率为9600 bps int dataBits = 8; // 数据长度设为8位 char parity = 'N'; // 奇偶校验无(N),奇(O),偶(E) int stopBits = 1; // 停止位数设为1 boolean echo = false; // 关闭回声功能 try { Modbus.connectRS232(portName, baudRate, dataBits, parity, stopBits, echo); System.out.println("成功打开串口:" + portName); // 继续执行其他操作... } catch (ConnectionException e) { System.err.println("无法建立与设备的连接"); throw e; } finally { if(Modbus.isConnected()){ Modbus.disconnect(); System.out.println("已关闭串口连接"); } } } } ``` 这段代码展示了如何利用 `connectRS232()` 方法来设定串行接口的具体属性,并尝试开启到目标硬件的链接。一旦完成必要的交互之后,则应当调用 `disconnect()` 来释放资源。 #### 执行读取/写入命令 当建立了有效的连接后,就可以发送请求给远程节点以获取或修改寄存器中的值了。这里给出了一些常见的函数调用来展示基本的数据交换过程。 ```java // ... 上述try-catch-finally语句块内继续... int slaveAddress = 1; // 设备地址(从机ID) short startAddress = 0x000A; // 起始寄存器地址 int quantityOfRegisters = 5; // 请求的数量 // 读取保持寄存器(Read Holding Registers) short[] readResult = Modbus.readHoldingRegisters(slaveAddress, startAddress, quantityOfRegisters); for(short value : readResult){ System.out.printf("Register Value: %d\n",value); } // 写单个线圈状态(Write Single Coil) boolean coilValueToSet = true; // 将要写的布尔值(true/false) Modbus.writeSingleCoil(slaveAddress, startAddress, coilValueToSet); System.out.println("已更新线圈状态"); // 更多的操作可以参照官方文档说明进行扩展... ``` 以上就是基于 `easymodbus4j` 库在 Java 中实施 Modbus RTU 串行通信的一个简单例子。实际项目里可能还需要处理异常情况下的试机制以及其他高级特性支持。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值