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串口通讯相关推荐

  1. 串口 发送 接收 高位_电工进阶PLC大神,必备PLC串口通讯的基本知识!

    戳上方蓝字"技成电工课堂"快速关注!!! 电力作业人员在使用PLC的时候会接触到很多的通讯协议以及通讯接口,最基本的PLC串口通讯和基本的通讯接口你都了解吗?1,什么是串口通讯? ...

  2. plc和pc串口通讯接线_让你搞懂PLC串口通讯和通讯接口,这东西估计没几个能说清楚~...

    电力作业人员在使用PLC的时候会接触到很多的通讯协议以及通讯接口,最基本的PLC串口通讯和基本的通讯接口你都了解吗? 1,什么是串口通讯? 串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线 ...

  3. android 串口开发_详细分析Esp8266上电信息打印的数据,如何做到串口通讯上电不乱码打印...

    01 写在前面: 上篇关于如何在内置仅1M的Esp8285做到 OTA 升级的同步到微信公众号,竟然被安信可的某些运维人员看到了,想要转载,我很欣慰,竟然自己的笔记可以被这么大型的公司员工认可! 我是 ...

  4. CC2530学习路线-基础实验-串口通讯发送字符串(4 未完待续)

    目录 1. 前期预备知识 1.1 串口通讯电路图 1.2 实验相关寄存器 1.2 常用波特率设置 本章未完待续..... 原来写的文章已经丢失了,只能找到这一小部分,看什么时候有时间再补上. 1. 前 ...

  5. c++实现sscom串口助手循环发送_串口通讯你真的会了吗?不妨看看这些经验

    点击上方「嵌入式大杂烩」,选择「置顶公众号」第一时间查看编程笔记! 平时使用串口打印出现乱码的绝大部分原因是串口波特率没对.那么我们怎么测量实际的波特率呢?在这之前,顺便一起回顾一下波特率的概念. 什 ...

  6. VC基于MSCOMM控件串口通讯

    在mfc中进行串口通讯最简单的方法莫过于在对话框中使用MSCOMM控件了,MSComm通信控件提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他通信设备(如Modem). 还可以发送命 ...

  7. delphi 串口通信发送_STM32第五章串口通讯详解

    点击上方"果果小师弟",选择"置顶/星标公众号"干货福利,第一时间送达! 串口通信是串行通信里面的异步方式.串行通信是相对于并行通信来说的.串口是一个事实存在的 ...

  8. Android蓝牙串口通讯【转】

    本文转载自:http://blog.sina.com.cn/s/blog_631e3f2601012ixi.html Android蓝牙串口通讯 闲着无聊玩起了Android蓝牙模块与单片机蓝牙模块的 ...

  9. python树莓派串口通信实例_Python实现树莓派USB串口通讯及云端对接

    → USB串口通讯 树莓派上自带一个串口,用于连接蓝牙或是串口命令行,串口资源很少,对于嵌入式的应用来说串口设备很多,需要的串口数量也很多,因为通过USB外接串口是一个不错的选择. 1. 我手中的US ...

最新文章

  1. 将编译器pass添加到Relay
  2. Htaccess文件是什么以及Windows下自由创建.htaccess文件的N种方法
  3. 单元测试——第六周作业
  4. 未来50年的神经科学会是什么样呢?
  5. Sichuan University Programming Contest 2011 Preliminary(for Non-SCUers) / M A Simple Problem
  6. sql server 服务器之间传递消息,SQL Server 2008 Service Broker教程 - 无法接收消息(transmission_status中的异常)...
  7. 转载_模运算_归纳得很精华啊
  8. 开源贡献 计算_学生如何开始为开源软件做贡献
  9. PHP unicode与普通字符串的相互转化
  10. 使用知行之桥® EDI系统对接德州仪器TI
  11. Elman神经网络介绍以及Matlab实现
  12. 计算机网络中netbuie,材料内部空隙体积占其总体积的百分率叫做()。A、孔隙率B、填充率C、空隙率D、密实度...
  13. Machine learning approximation algorithmsfor high-dimensional fully nonlinear PDE
  14. eas 税率修改_5月1日开始,金蝶ERP系统税率调整方法与步骤
  15. 呼叫中心中间件(mod_cti基于FreeSWITCH)-排队(ACD 话务分配)
  16. 阿里云ACP认证适合什么样的人考?
  17. PHP下处理HTTP--json--xml信息
  18. C#实现Winform间的数据交互的三种方法
  19. Shell 脚本--------正则表达式的认知
  20. 微信小程序绘图canvas,绘制网络图片

热门文章

  1. 苹果手机如何实现苹果微信分身多开
  2. 【JavaScript 教程】第六章 数组06— slice() :复制数组元素
  3. 十大跑步运动耳机品牌排行榜,目前热销的运动耳机推荐
  4. GPUImage说明 各文件说明
  5. RFID机场推车电子标签的使用-RFID机场手推车资产管理追踪解决方案-新导智能
  6. Java基于SSM的企业OA办公系统
  7. 任务计划程序定时关机
  8. 筋膜枪PCBA芯片方案介绍
  9. 材料员报考建筑八大员报考建筑材料钢筋和混凝土的特性介绍
  10. canal-adapter踩坑