java读取modbus(串口,DTU(WIFI )也可 DTU(gprs)也可)协议数据 解释详细 踩坑完整 拿来就可以用的demo(下)

福兮祸所伏, 祸兮福所倚。(现在发生在你身上的都是好事,福祸相伴)  

这些源码应该都可以看的懂  我就不解释了。

public void Connect(String comPort) throws Exception {// 类似于串口连接(个人理解)this.portIdentifier = CommPortIdentifier.getPortIdentifier(comPort);if (this.portIdentifier.isCurrentlyOwned()) {System.out.println("Error: Port is currently in use");} else {int timeout = 2000;// 串口对象CommPort commPort = this.portIdentifier.open(this.getClass().getName(), timeout);if (commPort instanceof SerialPort) {this.serialPort = (SerialPort)commPort;this.serialPort.setSerialPortParams(9600, 8, 1, 2);this.serialPort.enableReceiveTimeout(1000);this.serialPort.disableReceiveThreshold();this.in = this.serialPort.getInputStream();this.out = this.serialPort.getOutputStream();this.serialflag = true;} else {System.out.println("Error: Only serial ports are handled by this example.");}}}

那咱们就运行  ,结果。。。。。。。。。。。

少了个处理串口的依赖包 (我用的是RXTX  2.2,当时找的时候  网上那些都是粘贴,估计怎么搞得  他们都不知道   搞得我晕头转向的   真的是误人子弟。上解决方法)

下载RXTX2.2(包括各个系统版本)

 将RXTXcomm.jar以上面相同的方式 引入到你的项目 

 我的是64的  我直接说64的  32位的会有所不同  留给你们自己去探索吧

  1. 找到RXTXcomm.jar   复制你的java_home下jre\lib和jre\lib\ext
  2. 点击进入win64  复制rxtxSerial.dll 到\jre\bin

 那接下来是不是可以见证奇迹了呢     还要再等下  

  1. 如果单单是串口读取的话   我们现在的代码就可以完全操作了
  2. 如果说是wifi (就一ip地址+端口,局域网, 不要想的那么复杂)  如果说  我搞个虚拟串口的话  是不是 我直接操作虚拟串口就可以了呢(我直接给串口发数据,然后直接使用咱们的上面代码就可以搞定了吧。)
  3. 如果说是GPRS呢?  wifi我可以处理   你外网我当然可以处理  同理 在云服务器上嫁接个虚拟串口  完全ok。
  4. 补充一点:wifi和GPRS都可以理解为TCP协议。

先给你们个虚拟串口工具的直通车

V-COM虚拟串口工具

 这个工具的话  在使用中  如果说  你删除串口的话  还提示串口被占用的话     其他的不要多想     直接去服务里面找到v-com-Service     枪杀了它  就OK了   或者重启当前服务也可以  

补充:  其他人都不知道   这可是我自己研究出来的。啧啧

不多比比了  看效果 

 解释下 咱们发送命令是怎么产生

02  03  00 01  00  04  15  FA

02对应的是咱们java的

modbusClient.setUnitIdentifier((byte)1);也就是DTU的id

03 是功能码 对应咱们的

modbusClient.ReadHoldingRegisters  (只要是这个方法的就是03)

00 01  对应的是咱们的

 modbusClient.ReadHoldingRegisters(1, 4)的第一个参数   也就是寄存器的起始地址

 00 04 对应的是咱们的

 modbusClient.ReadHoldingRegisters(1, 4)的第二个参数   也就是读取寄存器的长度   物联网的寄存器也就是软件的内存地址  可以这样理解。 

15 FA  对CRC校验码   是根据  02 03 00 01 00 04 这些数据 生成的    就类似于微信官方接口的凭证

DTU返回的数据(02 03 08 00 00 07 79 00 01 80 d3  77 73)解释:

02 03 不解释了   

08代表的是数据是后面的8个字节    00 00 07 79 00 01 80 d3      4个对应一个值   这些都是16进制  需要转化(放心,会把我写工具类给你   你拿去用就好。)

77 73 CRC校验码

 

最后 把写的工具类给你们吧    针对于modbus协议  基本上都使用的

public static String getAlValue(int al1High, int al1Low) {int highAl1 = 0;int lowAl1 = 0;if (al1High >= 0) {highAl1 = al1High * 65536;System.out.println("highAl1的值为:" + highAl1);} else {highAl1 = Integer.valueOf(getAlHex(al1High));System.out.println("highAl1的值为:" + highAl1);}if (al1Low >= 0) {lowAl1 = al1Low;System.out.println("lowAl1的值为:" + lowAl1);} else {lowAl1 = Integer.valueOf(getAlHex(al1Low));System.out.println("lowAl1的值为:" + lowAl1);}return String.valueOf(highAl1 + lowAl1);}
private static String getAlHex(int lowOrder) {// 去掉符号位lowOrder =  Math.abs(lowOrder);// 转为2进制String al1Str = Integer.toBinaryString(lowOrder);String zorn = "";if (al1Str.length() < 16) {for (int i = 0; i< 16 - al1Str.length(); i++) {zorn += "0";}}al1Str = zorn + al1Str;/*** * 转为数组  遍历循环  取补码*/// 转为数组String[] alArrStr = al1Str.split("");// 先转反码  再转为补码String str = getComplement(alArrStr);// 转为10进制int bitStr = Integer.parseInt(str, 2);// 返回16进制return String.valueOf(bitStr);}
private static String getComplement (String[] alArrStr) {StringBuilder str = new StringBuilder();// 遍历  获取反码for (int i = 0; i < alArrStr.length; i++) {if (MeterConstant.BIT_ZERO_FLAG.equals(alArrStr[i])) {str.append(MeterConstant.BIT_ONE_FLAG);} else {str.append(MeterConstant.BIT_ZERO_FLAG);}}String[] code = str.toString().split("");Boolean isCarry = false;// 再去补码for (int i = code.length - 1; i < code.length; i--) {if (MeterConstant.BIT_ZERO_FLAG.equals(code[i])) {if (isCarry) {code[i] = MeterConstant.BIT_ONE_FLAG;isCarry = false;}break;} else {code[i] = MeterConstant.BIT_ZERO_FLAG;isCarry = true;}}return org.apache.commons.lang3.StringUtils.join(code);}

这是我项目中的数据读取效果。好好看下  应该可以看懂

工具类  写的有点乱,也有点low     也懒得改了  但是绝对好用。就到这里吧   如果感觉有用的话 就打赏下小弟吧。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/256179.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Linux串口编程短信篇(一) ——— 串口通信初始化

文章目录 一. 前言二. 短信篇介绍三. 串口初始化3.1 流程图 3.2 代码 一. 前言 前面关于串口通信&#xff0c;串口编程的文章也总结了许多&#xff0c;之前的有一篇文章&#xff0c;写的是编程实现busybox microcom 工具&#xff0c;将功能模块一一分开&#xff0c;其实有一点多…

Linux串口编程短信篇(三) ——— AT指令封装实现Check系列函数及SMS函数封装

文章目录 一. 很重要的函数: send_at_cmd()1.1 设计思路1.2 send_at_cmd() 二. Check系列函数2.1 check_comport_ready()2.2 check_if_there_is_sim()2.3 check_sim_login()2.4 check_sim_signal()2.5 check_sim_allready() 三. 获取短信中心号码四. TEXT / PDU SMS SEND4.1 TE…

Compareable接口

重写 compareTo方法如下&#xff1a; public int compareTo(Object o) {Name n (Name) o;int lastCmp secondName.compareTo(n.secondName);return(lastCmp!0 ? lastCmp:firstName.compareTo(n.firstName));}完整代码如下 import java.util.List; import java.util.LinkedLi…

@ServeletComponentScan和@ComponentScan的区别

一、SpringBoot中使用Servlet 在SpringBootApplication上使用ServletComponentScan注解后&#xff0c;Servlet、Filter、Listener可以直接通过WebServlet、WebFilter、WebListener注解自动注册&#xff0c;无需其他代码。 1.在入口Application类上加入注解ServletComponentSca…

Linux系统imx6ull开发板内核安装STM Virtual ComPort虚拟串口驱动

目录 前言 一、问题描述 二、解决步骤 1.更改option.c文件 2.修改内核编译选项 3.编译内核并加载到开发板 总结 前言 本文硬件使用正点原子imx6ull-min底板emmc ddr512核心板&#xff0c;软件使用正点原子针对imx6ull开发板提供的出场Linux内核源码、设备树与根文件系统&#…

MDK5:正点原子stm32遇Target not created的解决方法

几乎在直接打开这里的test.uvprojx文件进行编译运行时都会出现以上的错误。这时候只需关闭改工程&#xff0c;然后右击keil5的应用程序&#xff0c;点击“以管理员身份运行”&#xff0c;打开之后即可编译成功。

MDK5 添加Device

现象如下图&#xff1a; 出现这个问题的原因有两种&#xff0c;因此有两种解决方法&#xff1a; 第一种&#xff1a;大部分为网上介绍的&#xff0c;没有下载Pack包&#xff0c;进入Packs Installer中选择自己需要的芯片系列选择包进行下载即可。 第二种&#xff1a;不常见的…

Keil MDK 软件包(MDK5 Software Packs)离线下载方法

最近 Keil 官网的 MDK 软件包下载页面不展示软件包的下载列表了&#xff0c;无法下载软件包&#xff0c;如图1所示。 图1 Keil 官网 MDK5 Software Packs 下载页面截图 其实是有办法下载软件包的&#xff0c;方法如下&#xff1a; 1、打开 Microsoft Edge 浏览器&#xff08;其…

Keil MDK5 打开MDK4项目

安装完最新版本keil(5.38a)后&#xff0c;需要打开几个MDK4的项目&#xff0c;结果一打开keil就提示报错了。 这里我选择的是第二种方式&#xff0c;首先安装legacy support&#xff0c;以下是下载链接 MDK v4 Legacy Support (keil.com) 安装完成以后&#xff0c;可能会遇到另…

keil MDK5 无法 Go To Definition Of

目录 1.勾选 Browse Information 2.重新编辑即可 弹出如下窗口&#xff1a; 编译没有通过&#xff0c;或者函数有编译条件限制&#xff08;在某个条件成立时&#xff0c;函数才会被keil编译&#xff09;&#xff0c;没有被编译的函数是不能使用“Go To Definition Of”跳转到…

MDK5__配色方案

这个MDK5的配色方案是仿照Notepad里面的Plastic Code Wrap主题&#xff0c;字体是Courier New&#xff0c;个人比较喜欢这个主题配色方案&#xff0c;同时经常看代码不会觉得太刺眼 配色过程 修改颜色有两种方案&#xff0c;最简单的是在MDK软件中&#xff0c;通过Edit->C…

MDK5的安装

一、安装MDK5 下载&#xff1a; 官方下载地址&#xff1a;http://www2.keil.com/mdk5 1.打开官方网站&#xff0c;并点击下载MDK5 2.按照要求填写信息并点击提交 3.点击下载 安装 1.双击图标进行安装 2.进入安装界面——点击Next&#xff08;下一步&#xff09; 3.选中…

ARM KEIL: MDK5 Software Packs

ARM&#xff1a;Advanced RISC Machines 先进的精简指令集器件。 ARM是最当下最流行的处理器&#xff0c;尤其在嵌入式领域。 KEIL被ARM收购&#xff0c;MDK5是ARM官方的开发工具。 作为一款面向微控制器和微处理器的软件开发工具&#xff0c;需要支持各种各样的芯片。 所以…

STM32——新建 Keil MDK 5 工程(寄存器版本)

注&#xff1a;本文仅依照加粗字体和图片可快速新建 Keil MDK 5 工程 由于文章没有细分步骤&#xff0c;标记点用于方便阅读。 &#x1f53a; 标记点 ① 打开 Keil MDK 5&#xff0c;点击Project > New μVision Project&#xff0c;如图&#xff1a; &#x1f53a; 标记…

MDK5之.map文件解析

MDK5之.map文件解析 前言一、.map文件总览二、详细介绍1、Section Cross References&#xff1a;模块、段(入口)交叉引用2、Removing Unused input sections from the image&#xff1a;移除未使用的模块3、Image Symbol Table&#xff1a;映射符号表4、Memory Map of the imag…

MDK5 与 GIT 配合使用

参考 Abstract: (keil.com) 1&#xff0c;增加忽略文件 (.gitignore) &#xff08;我一般喜欢把输出文件放到Objects/目录下&#xff09; Listings/ Objects/ *.TMP 2 最好是mdk5.15以上版本&#xff0c;不然需要拷贝文件到此目录 Vision 5.15 is providing a SVCS templ…

Keil MDK5硬件仿真之基本介绍

Keil MDK5这个软件是提供硬件仿真功能的&#xff0c;所谓硬件仿真就是指将当前的程序实时的运行在你的设备中&#xff0c;并且可以检测程序中的变量的值&#xff0c;或者控制程序运行的流程&#xff0c;下面就让我们来看一下如何进行硬件仿真吧。 第一步&#xff0c;单击Optio…

keil MDK5软件包介绍、下载、安装与分享

前言 本文介绍了Keil MDK5软件包的分类、作用、下载、安装与更新。软件包下载可通过Keil自带的Pack Installer、进入Keil Pack下载网站手动下载、去芯片厂家官网下载三种方式。同时分享了一个小技巧&#xff0c;可以直接分享已安装好的软件包给别人。 一. Keil MDK软件包介绍 K…

Ubuntu安装MDK5

1 环境部署 Ubuntu 18.04 Wine 3.0.4 1.1 查看CPU信息 lscpu序号属性描述1架构x86_642CPU 运行模式32-bit, 64-bit3字节序Little Endian4CPU45在线 CPU 列表0-36每个核的线程数17每个座的核数48座19NUMA 节点110厂商 IDGenuineIntel11CPU 系列613型号15814型号名称Intel Core…

下载MDK5 Software Packs导入Keil5

⭐最近在用Keil5编译STM32L系列的项目文件&#xff0c;在选择芯片型号时并没有自己的STM32L系列的芯片&#xff0c;找了很久&#xff0c;才找到下载的网址&#xff0c;现在来分享一下自己下载和安装的过程。&#x1f308; 1.下载网址 MDK Software Packs下载地址 以上就是MDK5的…