Java采集传感器数据,亲测有效!

背景

先说背景

最近公司项目需要用到传感器,采集设备温湿度,倾斜角,电流…,公司采购采购了一个温湿度传感器给我们开发测试使用,如下图:

image-20231027213450647

看着还挺精致有没有。

进入正题

有了这个温湿度传感器,我们如何读取其采集到的数据呢。需要一个RS485转串口工具,下面这个蓝色的东东:

image-20231027213752928

把它接到传感器上,然后插到电脑上

image-20231027213858771

通过电脑设备管理器-端口,可以看到该设备串口号是COM3,这个参数记住下面采集数据需要。

接下来,先用工具TH11S-B Tool_V105,直接读取温湿度。

工具长这样image-20231027214139239

打开工具,

image-20231027214357841

除了串口号,其他参数基本都是固定的,也看到页面上串口号也确实是COM3,然后点击连接直接连接串口。

此时点击读取就能读到当时的温湿度值,可以看到通过串口与传感器交互的协议报文。

image-20231027214545607

读取报文01 03 00 00 00 02 C4 0B,经过搜索得知这个是ModBus-RTU协议(传感器常用协议)的报文,具体含义如下:

ChatGPT回答:

这个报文 01 03 00 00 00 02 C4 0B 是一个 Modbus RTU 协议的请求报文,它的各部分含义如下:

  1. 01:从站地址,表示要操作的 Modbus 从站的地址。在这个例子中,从站地址为 1。
  2. 03:功能码,表示请求的操作类型。在 Modbus 中,功能码 03 表示读取保持寄存器。这个功能码用于读取传感器的数据。
  3. 00 00:起始寄存器地址,指示要读取的寄存器的起始地址。在这个例子中,起始寄存器地址为 0x0000(通常是一个 16 位的寄存器地址)。
  4. 00 02:寄存器数量,表示要读取的连续寄存器的数量。在这个例子中,要读取 2 个寄存器。
  5. C4 0B:CRC 校验,用于确保报文的完整性。

这个请求报文的目的是要求 Modbus 从站(通常是传感器或其他设备)返回起始寄存器地址为 0x0000 的 2 个寄存器的数据。这些数据通常包括传感器的温度和湿度值,具体含义取决于传感器的规格和协议。所以,你需要根据你的传感器的规格和协议来解析这些数据。

具体协议不做研究,主要看看响应报文01 03 04 00 FE 02 50 9A 9F,具体含义如下:

ChatGPT回答:

这个响应报文 01 03 04 00 FE 02 50 9A 9F 是 Modbus RTU 协议的响应报文,其各部分含义如下:

  1. 01:从站地址,表示响应来自 Modbus 从站的地址。在这个例子中,从站地址为 1,与请求报文相同。

  2. 03:功能码,表示响应的操作类型。在 Modbus 中,功能码 03 表示读取保持寄存器。这个功能码用于读取传感器的数据,与请求报文相同。

  3. 04:字节数,表示响应数据的字节数。在这个例子中,有 4 个字节的数据。

  4. 00 FE:数据,表示读取到的保持寄存器数据。这里的数据是 2 个 16 位寄存器的值,以大端模式表示(高位在前,低位在后)。在这个例子中,它的十六进制值为 00 FE,对应的十进制值是 254。

  5. 02:CRC 校验,用于确保报文的完整性。

根据响应报文中的数据部分,这个特定传感器的温度值为 254。要了解确切的温度单位和规范,请参考传感器的文档或规格表。通常,温度值需要进一步处理和解释,以转换为实际的温度单位(例如摄氏度或华氏度)。

其他无需关注只需知道**00 FE(第四五字节)表示温度值,02 50(第六七字节)表示湿度值**即可,十六进制转为十进制然后直接除以十就是真实温湿度值。

00 FE:254 / 10.0 = 25.4度(温度)

02 50:592 / 10.0 = 59.2%(湿度)

代码实战

经过一些调研,要使用Java读取传感器数据,jSerialComm依赖用的比较多。

添加依赖

项目中添加依赖

       <dependency><groupId>com.fazecast</groupId><artifactId>jSerialComm</artifactId><version>2.9.2</version></dependency>

封装构建请求报文工具类

接下来构建请求报文,创建工具类与请求报文格式对应如下:

public class ModbusRTURequestBuilder {/*** @param slaveAddress 从站地址* @param functionCode 功能码* @param startAddress 起始寄存器地址* @param registerCount 寄存器数量* @return Modbus-RTU 协议请求报文*/public static byte[] buildModbusRTURequest(int slaveAddress, int functionCode, int startAddress, int registerCount) {// 创建一个字节数组用于存储报文byte[] request = new byte[8];// 设置从机地址request[0] = (byte) slaveAddress;// 设置功能码request[1] = (byte) functionCode;// 设置起始寄存器地址(高位和低位)request[2] = (byte) (startAddress >> 8);request[3] = (byte) (startAddress & 0xFF);// 设置寄存器数量(高位和低位)request[4] = (byte) (registerCount >> 8);request[5] = (byte) (registerCount & 0xFF);// 计算CRC校验并设置到报文中int crc = calculateCRC(request, 6);request[6] = (byte) (crc & 0xFF); // 低位request[7] = (byte) (crc >> 8); // 高位return request;}private static int calculateCRC(byte[] message, int length) {int crc = 0xFFFF;for (int i = 0; i < length; i++) {crc ^= (message[i] & 0xFF);for (int j = 0; j < 8; j++) {if ((crc & 1) == 1) {crc = (crc >> 1) ^ 0xA001;} else {crc = crc >> 1;}}}return crc;}
}

与传感器交互,解析响应报文

接下来与传感器交互,解析响应报文温湿度值

简单测试一下:

public class SerialSensorReader {public static void main(String[] args) {// 设置串口一些参数,除了串口号其他基本固定 COM3就是开头要大家记住的串口号SerialPort serialPort = SerialPort.getCommPort("COM3"); // 串口设备名称serialPort.setBaudRate(9600); // 波特率serialPort.setNumDataBits(8); // 数据位serialPort.setParity(SerialPort.NO_PARITY); // 校验位serialPort.setNumStopBits(1); // 停止位if (serialPort.openPort()) {// 借助工具类,构建请求报文byte[] requestMessage = ModbusRTURequestBuilder.buildModbusRTURequest(1, 3, 0, 2);// 读取温湿度serialPort.writeBytes(requestMessage, requestMessage.length);try {Thread.sleep(100); // 等待足够的时间以确保传感器响应} catch (InterruptedException e) {e.printStackTrace();}// 响应数据的长度根据传感器规格进行配置(该传感器响应报文长度为9,不同传感器自行调整)byte[] responseData = new byte[9]; // 获取响应 	int bytesRead = serialPort.readBytes(responseData, responseData.length);if (bytesRead == responseData.length) {// 解析温湿度数据int temperature = ((responseData[3] << 8) | (responseData[4] & 0xFF));int humidity = ((responseData[5] << 8) | (responseData[6] & 0xFF));System.out.println("温度: " + temperature / 10.0);System.out.println("湿度: " + humidity / 10.0);} else {System.out.println("未收到完整的响应数据");}serialPort.closePort();} else {System.out.println("无法打开串口");}}
}

经测试,数据没有问题:

image-20231027221424840

文章不长,也是博主一点一点搜出来、ChatGPT出来的,其中也是踩了不少坑,创作不易,请一键三连啊!(如果文章对您有用的话,不妨给我一个大大的赞,您的赞是我创作的动力。)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring | Spring Cache 缓存框架

Spring Cache 缓存框架&#xff1a; Spring Cache功能介绍Spring Cache的Maven依赖Spring Cache的常用注解EnableCaching注解CachePut注解Cacheable注解CacheEvict注解 Spring Cache功能介绍 Spring Cache是Spring的一个框架&#xff0c;实现了基于注解的缓存功能。只需简单加一…

ubuntu 22.04安装百度网盘

百度网盘 客户端下载 (baidu.com) 下载地址 sudo dpkg -i baidunetdisk_4.17.7_amd64.deb

高防CDN:保卫您的网站免受攻击之利与弊

在当今数字化时代&#xff0c;网络安全对于网站经营者至关重要。高防CDN&#xff08;Content Delivery Network&#xff09;技术旨在提供强大的安全性&#xff0c;以保护网站免受恶意攻击。本文将探讨高防CDN为普通网站带来的优势与不足之处&#xff0c;并分析国内外高防CDN的发…

谷歌真的不喜欢 Node.js ?

有人在 Quora 上提问&#xff0c;为什么谷歌不喜欢 Node.js 呢&#xff0c;Google 的 UX 工程师和来自 Node.js 团队的开发者分别回答了他们对这个问题的看法&#xff0c;对于编程语言来说&#xff0c;每一门语言都有它自己的优势&#xff0c;重要的是如何用它去解决问题。 谷…

SpringBoot集成Redis主从架构实现读写分离(哨兵模式)

一、前言 这里会使用到spring-boot-starter-data-redis包&#xff0c;spring boot 2的spring-boot-starter-data-redis中&#xff0c;默认使用的是lettuce作为redis客户端&#xff0c;也推荐使用lettuce&#xff0c;Redis使用哨兵集群&#xff0c;这里会通过lettuce连接到哨兵…

Flume基本使用--mysql数据输出

MySQL数据输出 在MySQL中建立数据库school&#xff0c;在数据库中建立表student。SQL语句如下&#xff1a; create database school; use school; create table student(id int not null,name varchar(40),age int,grade int,primary key(id) ); 请使用Flume实时捕…

1. 两数之和、Leetcode的Python实现

博客主页&#xff1a;&#x1f3c6;看看是李XX还是李歘歘 &#x1f3c6; &#x1f33a;每天分享一些包括但不限于计算机基础、算法等相关的知识点&#x1f33a; &#x1f497;点关注不迷路&#xff0c;总有一些&#x1f4d6;知识点&#x1f4d6;是你想要的&#x1f497; ⛽️今…

【Elasticsearch】es脚本编程使用详解

目录 一、es脚本语言介绍 1.1 什么是es脚本 1.2 es脚本支持的语言 1.3 es脚本语言特点 1.4 es脚本使用场景 二、环境准备 2.1 docker搭建es过程 2.1.1 拉取es镜像 2.1.2 启动容器 2.1.3 配置es参数 2.1.4 重启es容器并访问 2.2 docker搭建kibana过程 2.2.1 拉取ki…

Kafka - 深入了解Kafka基础架构:Kafka的基本概念

文章目录 Kafka的基本概念 Kafka的基本概念 我们首先了解一些Kafka的基本概念。 1&#xff09;Producer &#xff1a;消息生产者&#xff0c;就是向kafka broker发消息的客户端2&#xff09;Consumer &#xff1a;消息消费者&#xff0c;向kafka broker获取消息的客户端3&…

【代码随想录】算法训练计划03

1、203. 移除链表元素 题目&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 思路&#xf…

hdlbits系列verilog解答(模块按名字)-22

文章目录 一、问题描述二、verilog源码三、仿真结果 一、问题描述 此问题类似于模块。您将获得一个名为的 mod_a 模块&#xff0c;该模块按某种顺序具有 2 个输出和 4 个输入。您必须按名称将 6 个端口连接到顶级模块的端口&#xff1a; module mod_a ( output out1, output …

DVWA-Cross Site Request Forgery (CSRF)

大部分网站都会要求用户登录后,使用相应的权限在网页中进行操作,比如发邮件、购物或者转账等都是基于特定用户权限的操作。浏览器会短期或长期地记住用户的登录信息,但是,如果这个登录信息被恶意利用呢?就有可能发生CSRF CSRF的英文全称为Cross Site Request Forgery,中文…

如何通过内网穿透实现公网远程连接Redis数据库

公网远程连接Redis数据库【内网穿透】 文章目录 公网远程连接Redis数据库【内网穿透】前言1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一个固定tcp地址4.2 配置固定TCP地址…

Docker Swarm 节点维护

Docker Swarm Mode Docker Swarm 集群搭建 Docker Swarm 节点维护 Docker Service 创建 1.角色转换 Swarm 集群中节点的角色只有 manager 与 worker&#xff0c;所以其角色也只是在 manager 与worker 间的转换。即 worker 升级为 manager&#xff0c;或 manager 降级为 worke…

深眸科技以需求定制AI视觉解决方案,全面赋能产品外观缺陷检测

产品外观是影响产品质量最重要的因素之一&#xff0c;其平整度、有无瑕疵等不仅影响到产品美观&#xff0c;甚至能够直接影响产品本身的使用和后续加工&#xff0c;给企业带来重大经济损失。 随着人工智能技术的快速发展&#xff0c;机器视觉与AI技术的结合应用加速渗透进工业…

MongoDB 的集群架构与设计

一、前言 MongoDB 有三种集群架构模式&#xff0c;分别为主从复制&#xff08;Master-Slaver&#xff09;、副本集&#xff08;Replica Set&#xff09;和分片&#xff08;Sharding&#xff09;模式。 Master-Slaver 是一种主从复制的模式&#xff0c;目前已经不推荐使用。Re…

Linux Mint 21.2 “EDGE” ISO 发布

Linux Mint 团队近日宣布发布最新 Linux Mint 21.2 “Victoria “版本的 “EDGE “ISO 版本&#xff0c;并提供下载。 “这个镜像是为那些硬件太新而无法启动 Linux Mint 21.x 中包含的 5.15 LTS 内核的用户制作的。 Linux Mint 21.2 “Victoria “于2023年7月中旬发布&#x…

【Linux】安装与配置虚拟机及虚拟机服务器坏境配置与连接---超详细教学

一&#xff0c;操作系统介绍 1.1.什么是操作系统 操作系统&#xff08;Operating System&#xff0c;简称OS&#xff09;是一种系统软件&#xff0c;它是计算机硬件和应用软件之间的桥梁。它管理计算机的硬件和软件资源&#xff0c;为应用程序提供接口和服务&#xff0c;并协…

hibernate源码(1)--- schema创建

sessionFactory 配置项&#xff1a; hibernate的核心是sessionFactory&#xff0c;那我们看看如何构建session Factory。 参考官网&#xff1a; plugins {id("java") } group "com.atai.hibernatespy" version "1.0-SNAPSHOT" repositories…

Latex笔记

目录 1. Section 编号方式(数字、字母、罗马)&计数器计数形式修改 3.一些常用的数学符号 4. 范数 5. 数学符号对照表 1. Section 编号方式(数字、字母、罗马)&计数器计数形式修改 IEEE模板中Section的编号是罗马数字&#xff0c;要是改投其他刊物的话可能得用阿拉…