Java通过rs458串口与硬件设备交互

本文介绍了如何使用Java进行RS485串口通信,以与硬件设备交互,特别是针对雷达水位计的访问。内容包括需求背景、串口通信的特点、RXTX库的配置、添加依赖以及业务代码的实现,同时提供了byte[]数组转double类型的转换方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java通过rs485串口与硬件设备交互:

**需求背景:**java代码访问雷达水位计,发送请求代码,接收返回代码,解析数据转换为double格式后发送给位于其它服务器的Java程序。

串口不同于socket通信,没有url与端口。串口即为计算机上的硬件连接端口,如USB端口、显示器端口等。监听串口的操作,就是使用代码或虚拟串口软件,定时监听指定串口动态,观察其是否有数据交互。
需要先要下载RXTX的jar包,win64位下载地址:http://pan.baidu.com/s/1o6zLmTc);将解压后的rxtxParallel.dll和rxtxSerial.dll两个文件放在%JAVA_HOME%/jre/bin目录下,这样该包才能被正常的加载和调用。

添加依赖:idea-Project Structure-Libraries-"+"添加rxtxjar包路径:通常在java jre\lib\ext下:例 D:\configFile\jdk1.8\jre\lib\ext

业务部分:

package com.example.waterlevel.service;

import com.alibaba.fastjson.JSONObject;
import com.example.waterlevel.service.impl.WaterLevelServiceImpl;
import gnu.io.PortInUseException;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.http.*;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.awt.*;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

@Service
@Slf4j
public class TaskService {
   

    @Autowired
    WaterLevelDataService waterLevelDataService;

    private RestTemplate restTemplate;

    @Autowired
    private void initRestTemplate(RestTemplateBuilder builder) {
   
        this.restTemplate = builder.build();
    }

    @Autowired
    WaterLevelServiceImpl waterLevelService;

    @Value("${hydrology.server_url}")
    private String URL;

    // 请求报文byte[]数组,每个设备应该都有对应的交互报文,在其配套文档里
    private static byte[] BYTES = new byte[]{
   0x01, 0x03, 0x00, 0x00, 0x00, 0x02, (byte) 0xC4, 0x0B};

    private final double BASELINE = 67.20;

    public double getWaterLevel4Radar() {
   
        log.info("getWaterLevel4Radar begin.");
        DecimalFormat df = new DecimalFormat("######0.00");
        try {
   
            // 开启端口:输入设备所连接的串口名(这里是COM3)打开串口链接,并开启监听
            int com;
            if (WaterLevelDataService.connect != 1) {
    // 这里加了一个标识,循环读取串口数据时,如果串口是打开状态则无需再次打开
                com = waterLevelDataService.listenPort("COM3");
                if (com != 1) {
   
                    log.error("串口开启失败,请检查串口情况");
                    return 0.0;
                }
            }
            // 向水位计发送请求报文
            for (int i = 0; i < 10; i++) {
   
                String msg = waterLevelDataService.setFlowSpeedOrder(BYTES); // 将常量请求报文byte[]数组发送至串口
                Thread.sleep(1000);
                log.info("请求发送情况: " + msg);
            }

            int size = WaterLevelDataService.doubleList.size();
            log.info("雷达水位集合数据条目: " + size);
            // 计算水位值
            for (int i = 0; i < 100; i++) {
   
                if (size >= 10) {
    // 收集到10条以上数据则计算平均水位值
                    double asDouble = WaterLevelDataService.doubleList.stream().mapToDouble(flt -> flt).average().getAsDouble();
                    double realLevel = BASELINE - asDouble / 100;
                    double formatRealLevel = Double.parseDouble(df.format(realLevel)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值