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

这篇具有很好参考价值的文章主要介绍了Java采集传感器数据,亲测有效!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

先说背景

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

java获取数据采集器的信息,碎片化小知识点,java,开发语言

看着还挺精致有没有。

进入正题

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

java获取数据采集器的信息,碎片化小知识点,java,开发语言

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

java获取数据采集器的信息,碎片化小知识点,java,开发语言

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

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

工具长这样java获取数据采集器的信息,碎片化小知识点,java,开发语言

打开工具,

java获取数据采集器的信息,碎片化小知识点,java,开发语言

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

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

java获取数据采集器的信息,碎片化小知识点,java,开发语言

读取报文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("无法打开串口");
        }
    }
}

经测试,数据没有问题:

java获取数据采集器的信息,碎片化小知识点,java,开发语言

文章不长,也是博主一点一点搜出来、ChatGPT出来的,其中也是踩了不少坑,创作不易,请一键三连啊!(如果文章对您有用的话,不妨给我一个大大的赞,您的赞是我创作的动力。)文章来源地址https://www.toymoban.com/news/detail-791746.html

到了这里,关于Java采集传感器数据,亲测有效!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【物联网】MPU6050传感器数据采集与滤波算法

    当谈到嵌入式电子设备和机器人的姿态控制和运动检测时,MPU6050往往是一个备受关注的传感器模块。它是一款小巧但功能强大的六轴传感器,集成了三轴加速度计和三轴陀螺仪。在本博客中,我们将详细介绍MPU6050的特点、工作原理以及与stm32配合的使用方法,后面看情况更新

    2024年02月14日
    浏览(37)
  • 4G MQTT采集RS485协议传感器到数据库

    1、Modbus slave设置从机Modbus TCP参数 设置Modbus TCP协议和地址 模拟软件设置的是 当前电脑的,所以后面 配置Modbus TCP的从机时,就要填当前电脑的ip地址,不要写 bl系列设备的ip地址 设置数据参数 设备地址:22 功能码:04 数据类型:16 起始地址:0 数量:5个 2、设置BL102将Modbus

    2024年02月02日
    浏览(33)
  • QML android 采集手机传感器数据 并通过udp 发送

    利用 qt 开发 安卓 app ,采集手机传感器数据 并通过udp 发送

    2024年02月02日
    浏览(42)
  • MLX90614红外测温传感器使用arduino采集温度数据OLED显示

    点击图片购买 MLX90614是一款由迈来芯公司提供的低成本,无接触温度计。输出数据和物体温度呈线性比例,具有高精度和高分辨率。TO-39金属封装里同时集成了红外感应热电堆探测器芯片MLX81101(温度是通过PTC或是PTAT元件测量)和信号处理专用集成芯片MLX90302,专门用于处理红

    2024年02月03日
    浏览(66)
  • 基于STM32 RS485传感器数据采集(参考正点原子部分代码)

    目前工业上,传感器一般都选RS485,modbus通讯协议,这种通讯方式,有很强的鲁棒性,本篇文章基于原子哥的精英板进行开发。 1、初始化与电脑通信的串口(PA9 PA10) 2、采用串口中断将数据保存到数组buff中 3、用定时器来配置一帧字节是否结束(空闲时间指定时间) 5、从机

    2024年02月11日
    浏览(39)
  • STM32采集问答式串口传感器数据写入SD卡(spi模式)

    STM32f103RCT6板子 问答式温湿度传感器(TTL信号) 外接SD卡模块(淘宝都差不多) 1. SD卡模块 ,采用SPI1接线 (CLK)SCK —PA5 (DATA0)MISO —PA6 (CMD)MOSI —PA7 (DATA3)CS —PA4 前面小括号里的是SDIO模式的接线,可以忽略。 2. 传感器模块 问答式TTL信号的传感器都可以, 连接到板子的串口2,

    2024年02月05日
    浏览(40)
  • STM32实现薄膜压力传感器数据采集(标准库和HAL库实现)

    单片机型号及压力传感器: STM32F103C8T6 最小系统板 压力传感器选用的是薄膜压力传感器 生活中经常遇到需要测量压力值,因此,考虑到这样的需求从网上买了一个薄膜压力传感器,实物图如下: 柔性薄膜压力传感器的 产品特点 : 超薄,厚度小于0.3mm 响应速度快 寿命长,通

    2024年02月02日
    浏览(35)
  • TCP透传数据至Onenet平台(简单用STM32上传采集的传感器数据)

    主页点击控制台  点击全部产品服务,再点击多协议接入  选择TCP透传,点击添加产品      点击确定,然后选择立即添加设备  点击添加设备  随便起个设备名称,这里的鉴权信息等下要用来作为登录设备用,点击添加  添加数据流模板,就是绑定上传的数据      这里我

    2024年02月05日
    浏览(34)
  • 008-关于FPGA/ZYNQ直接处理图像传感器数据输出的若干笔记(裸板采集思路)

    最近也是未来需要考虑做的一件事情是,如何通过FPGA/ZYNQ去做显微镜图像观测下的图像采集传输与后续的处理。目前显微镜观测领域通常是以PC端连接工业相机接口,这个接口可以是USB3.0,可以是网口,也可以是其它传输方式。常常通过工业相机输出的为视频流数据,厂商会

    2024年01月23日
    浏览(43)
  • 人工智能+物联网:从传感器到机器学习:智能化的数据采集和分析

    作者:禅与计算机程序设计艺术 大数据时代是一个数据爆炸的时代。如何从海量数据中快速找到隐藏在其中价值的信息,成为当今企业竞争中不可或缺的能力?人工智能和物联网正在成为经济领域和产业界的主流,新一代互联网物联网平台、AI智能终端、海量数据和算法驱动

    2024年02月09日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包