modbus4j串口通讯
1 使用modbus4j开源项目,通过串口读取数据,过程中遇到点小问题。(转的demo按自己的需求修改的) 2 3 1.串口不对应,导致 gnu.io.NoSuchPortException。 4 5 2.PLC485串口转COMM口,发/送线连接不对,导致读不到数据 6 7 3.rxtxSerial.dll放置的路径,查了下有人说放到myeclipse/jre/bin下,可我是放到C:\Windows\System32下,不知道原因。 8 9 4.RXTXcomm.jar包和rxtxSerial.dll文件不对应,可去官网下载同一版本。 10 11 5.读保持型寄存器和读输入型寄存器方法不一样。这是由于modbus协议,保持型功能码为03,输入型为04。通过api可找到对应的方法,用法也差不多一样。 12 13 class="java">package com.test.modbus; 14 15 import java.util.Arrays; 16 17 import com.serotonin.io.serial.SerialParameters; 18 import com.serotonin.modbus4j.ModbusFactory; 19 import com.serotonin.modbus4j.ModbusMaster; 20 import com.serotonin.modbus4j.exception.ModbusInitException; 21 import com.serotonin.modbus4j.exception.ModbusTransportException; 22 import com.serotonin.modbus4j.msg.ReadDiscreteInputsRequest; 23 import com.serotonin.modbus4j.msg.ReadDiscreteInputsResponse; 24 import com.serotonin.modbus4j.msg.ReadHoldingRegistersRequest; 25 import com.serotonin.modbus4j.msg.ReadHoldingRegistersResponse; 26 import com.serotonin.modbus4j.msg.WriteRegistersRequest; 27 import com.serotonin.modbus4j.msg.WriteRegistersResponse; 28 29 /** 30 * 通过串口解析MODBUS协议 31 * @author cl2 32 * 33 */ 34 public class TestModbusDemo { 35 //设定MODBUS网络上从站地址 36 private final static int SLAVE_ADDRESS = 1; 37 // 串行波特率 38 private final static int BAUD_RATE = 9600; 39 40 public static void main(String[] args) { 41 SerialParameters serialParameters = new SerialParameters(); 42 // 设定MODBUS通讯的串行口 43 serialParameters.setCommPortId("COM3"); 44 // 设定成无奇偶校验 45 serialParameters.setParity(0); 46 // 设定成数据位是8位 47 serialParameters.setDataBits(8); 48 // 设定为1个停止位 49 serialParameters.setStopBits(1); 50 // 设定端口名称 51 serialParameters.setPortOwnerName("Numb nuts"); 52 // 设定端口波特率 53 serialParameters.setBaudRate(BAUD_RATE); 54 55 // 创建ModbusFactory工厂实例 56 ModbusFactory modbusFactory = new ModbusFactory(); 57 // 创建ModbusMaster实例 58 ModbusMaster master = modbusFactory.createRtuMaster(serialParameters); 59 60 // 初始化 61 try { 62 master.init(); 63 readHoldingRegistersTest(master,SLAVE_ADDRESS,0,100); 64 65 } catch (ModbusInitException e) { 66 e.printStackTrace(); 67 } finally { 68 master.destroy(); 69 } 70 71 } 72 73 /** 74 * 读开关量型的输入信号 75 * @param master 主站 76 * @param slaveId 从站地址 77 * @param start 起始偏移量 78 * @param len 待读的开关量的个数 79 */ 80 private static void readDiscreteInputTest(ModbusMaster master, int slaveId, int start, int len) { 81 try { 82 ReadDiscreteInputsRequest request = new ReadDiscreteInputsRequest(slaveId, start, len); 83 ReadDiscreteInputsResponse response = (ReadDiscreteInputsResponse) master.send(request); 84 if (response.isException()) 85 System.out.println("Exception response: message=" + response.getExceptionMessage()); 86 else 87 System.out.println(Arrays.toString(response.getBooleanData())); 88 } 89 catch (ModbusTransportException e) { 90 e.printStackTrace(); 91 } 92 } 93 94 95 96 /** 97 * 读保持寄存器上的内容 98 * @param master 主站 99 * @param slaveId 从站地址 100 * @param start 起始地址的偏移量 101 * @param len 待读寄存器的个数 102 */ 103 private static void readHoldingRegistersTest(ModbusMaster master, 104 int slaveId, int start, int len) { 105 try { 106 ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest( 107 slaveId, start, len); 108 ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master 109 .send(request); 110 if (response.isException()) { 111 System.out.println("Exception response: message=" 112 + response.getExceptionMessage()); 113 } else { 114 System.out.println(Arrays.toString(response.getShortData())); 115 short[] list = response.getShortData(); 116 for(int i = 0; i < list.length; i++){ 117 System.out.print(list[i] + " "); 118 } 119 } 120 } catch (ModbusTransportException e) { 121 e.printStackTrace(); 122 } 123 } 124 125 126 127 /** 128 * 批量写数据到保持寄存器 129 * @param master 主站 130 * @param slaveId 从站地址 131 * @param start 起始地址的偏移量 132 * @param values 待写数据 133 */ 134 public static void writeRegistersTest(ModbusMaster master, int slaveId, int start, short[] values) { 135 try { 136 WriteRegistersRequest request = new WriteRegistersRequest(slaveId, start, values); 137 WriteRegistersResponse response = (WriteRegistersResponse) master.send(request); 138 if (response.isException()){ 139 System.out.println("Exception response: message=" + response.getExceptionMessage()); 140 } 141 else { 142 System.out.println("Success"); 143 } 144 } 145 catch (ModbusTransportException e) { 146 e.printStackTrace(); 147 } 148 } 149 }
modbus4j串口通讯相关推荐
- 串口 发送 接收 高位_电工进阶PLC大神,必备PLC串口通讯的基本知识!
戳上方蓝字"技成电工课堂"快速关注!!! 电力作业人员在使用PLC的时候会接触到很多的通讯协议以及通讯接口,最基本的PLC串口通讯和基本的通讯接口你都了解吗?1,什么是串口通讯? ...
- plc和pc串口通讯接线_让你搞懂PLC串口通讯和通讯接口,这东西估计没几个能说清楚~...
电力作业人员在使用PLC的时候会接触到很多的通讯协议以及通讯接口,最基本的PLC串口通讯和基本的通讯接口你都了解吗? 1,什么是串口通讯? 串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线 ...
- android 串口开发_详细分析Esp8266上电信息打印的数据,如何做到串口通讯上电不乱码打印...
01 写在前面: 上篇关于如何在内置仅1M的Esp8285做到 OTA 升级的同步到微信公众号,竟然被安信可的某些运维人员看到了,想要转载,我很欣慰,竟然自己的笔记可以被这么大型的公司员工认可! 我是 ...
- CC2530学习路线-基础实验-串口通讯发送字符串(4 未完待续)
目录 1. 前期预备知识 1.1 串口通讯电路图 1.2 实验相关寄存器 1.2 常用波特率设置 本章未完待续..... 原来写的文章已经丢失了,只能找到这一小部分,看什么时候有时间再补上. 1. 前 ...
- c++实现sscom串口助手循环发送_串口通讯你真的会了吗?不妨看看这些经验
点击上方「嵌入式大杂烩」,选择「置顶公众号」第一时间查看编程笔记! 平时使用串口打印出现乱码的绝大部分原因是串口波特率没对.那么我们怎么测量实际的波特率呢?在这之前,顺便一起回顾一下波特率的概念. 什 ...
- VC基于MSCOMM控件串口通讯
在mfc中进行串口通讯最简单的方法莫过于在对话框中使用MSCOMM控件了,MSComm通信控件提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他通信设备(如Modem). 还可以发送命 ...
- delphi 串口通信发送_STM32第五章串口通讯详解
点击上方"果果小师弟",选择"置顶/星标公众号"干货福利,第一时间送达! 串口通信是串行通信里面的异步方式.串行通信是相对于并行通信来说的.串口是一个事实存在的 ...
- Android蓝牙串口通讯【转】
本文转载自:http://blog.sina.com.cn/s/blog_631e3f2601012ixi.html Android蓝牙串口通讯 闲着无聊玩起了Android蓝牙模块与单片机蓝牙模块的 ...
- python树莓派串口通信实例_Python实现树莓派USB串口通讯及云端对接
→ USB串口通讯 树莓派上自带一个串口,用于连接蓝牙或是串口命令行,串口资源很少,对于嵌入式的应用来说串口设备很多,需要的串口数量也很多,因为通过USB外接串口是一个不错的选择. 1. 我手中的US ...
最新文章
- 将编译器pass添加到Relay
- Htaccess文件是什么以及Windows下自由创建.htaccess文件的N种方法
- 单元测试——第六周作业
- 未来50年的神经科学会是什么样呢?
- Sichuan University Programming Contest 2011 Preliminary(for Non-SCUers) / M A Simple Problem
- sql server 服务器之间传递消息,SQL Server 2008 Service Broker教程 - 无法接收消息(transmission_status中的异常)...
- 转载_模运算_归纳得很精华啊
- 开源贡献 计算_学生如何开始为开源软件做贡献
- PHP unicode与普通字符串的相互转化
- 使用知行之桥® EDI系统对接德州仪器TI
- Elman神经网络介绍以及Matlab实现
- 计算机网络中netbuie,材料内部空隙体积占其总体积的百分率叫做()。A、孔隙率B、填充率C、空隙率D、密实度...
- Machine learning approximation algorithmsfor high-dimensional fully nonlinear PDE
- eas 税率修改_5月1日开始,金蝶ERP系统税率调整方法与步骤
- 呼叫中心中间件(mod_cti基于FreeSWITCH)-排队(ACD 话务分配)
- 阿里云ACP认证适合什么样的人考?
- PHP下处理HTTP--json--xml信息
- C#实现Winform间的数据交互的三种方法
- Shell 脚本--------正则表达式的认知
- 微信小程序绘图canvas,绘制网络图片