关于Java对接温度、雷达液位传感器相关案例

一、需求

在SpringBoot项目中调用硬件厂商的仪器获取温度、高度等相关数据

二、了解通讯协议

根据硬件厂商通讯协议:

使用通信协议读取:(单位mm)
01 02 17 17 00 01 22 0F
回复:01 02 07 00 00 00 1D 3F 3F 
料高数据为0X 00 1D  解析十进制为 29 单位mm 

解析:只需要获取00 1D这四个16进制字符,进行10进制转换

三、请求案例

1、Socket请求

    /****
     * 使用Socket向相应ip:port发送指令
     * @param ip 设备ip
     * @param port 设备端口
     * @param sendHex 请求指令
     * @return 设备回复信息
     */
    public static byte[] sendCmdLiquidHeight(String ip, Integer port, String sendHex) {
        // 接收响应处理
        byte[] recvData = new byte[1024];
        try {
            // 创建未连接的 Socket 对象
            Socket socket = new Socket();
            // 设置连接超时(5 秒)
            socket.connect(new InetSocketAddress(ip, port), 5000);  //
            // 设置读取超时(3 秒)
            socket.setSoTimeout(3000);  //

            try (OutputStream out = socket.getOutputStream();
                 InputStream in = socket.getInputStream()) {
                // 发送指令
                byte[] sendData = hexToByte(sendHex, ' ');
                out.write(sendData);
                out.flush();
                logger.info("发送指令:" + sendData);

                // 接收响应(受 setSoTimeout 控制)
                int bytesRead = in.read(recvData);  // 若超时抛出 SocketTimeoutException
                String recvHex = bytesToHex(recvData, bytesRead);
                logger.info("接收响应:" + recvHex);
            }
        } catch (SocketTimeoutException e) {
            logger.error("操作超时: " + e.getMessage());  //
        } catch (IOException e) {
            logger.error("IOException: ");  //
            e.printStackTrace();
        }
        return recvData;
    }


    /**
      十六进制字符串转字节数组(支持分隔符)
     
      关键点说明:
        输入处理:接受类似 "01 03 10 16" 格式的字符串(分隔符由参数 split 指定)
        分割操作:使用指定分隔符将字符串拆分成十六进制片段数组
        字节转换:每个十六进制字符串(如 "1D")会被转换为对应的字节(0x1D)
        返回值:包含所有字节的数组,用于后续 Modbus 协议通信
        示例转换: 输入 "01 A3 FF" 分隔符为空格时,输出字节数组 [0x01, 0xA3, 0xFF]
     */
    private static byte[] hexToByte(String hexString, char split) {
        // 将十六进制字符串按指定分隔符拆分成数组
        String[] hexArray = hexString.trim().split(String.valueOf(split));

        // 创建与分割后数组长度相同的字节数组
        byte[] data = new byte[hexArray.length];

        // 遍历每个十六进制字符串片段
        for (int i = 0; i < hexArray.length; i++) {
            // 将十六进制字符串转换为整数,再强制转换为字节
            data[i] = (byte) Integer.parseInt(hexArray[i], 16);
        }
        return data;
    }
X


2、解析返回字节

	/**
     * 解析液位数据
     */
    public static int  parseYeWeiData(byte[] data) {
        // 例如:输入 01 02 07 00 00 00 1D 3F 3F 
        int startPos = 5;
        /*
        	跳过前5个数据字节 00 1D 3F 3F 
        	data[5] = 00
        	data[6] = 1D
        	00 表示为二进制   	 00000000
        	0xff 表示为二进制 	 11111111
        	00000000 & 11111111 = 00000000 -> 0
        	
            1D 表示为二进制   	 00011101
            0xff 表示为二进制 	 11111111
            00000000 & 11111111 = 00011101 -> (0001)16+ (1101)13=29
        */
        int highByte = data[startPos] & 0xFF;   // 消除符号位影响
        int lowByte = data[startPos + 1] & 0xFF;
        // 组合成16位整数(大端序)
        return (highByte << 8) | lowByte;
    }

四、调试工具-SSCOM串口调试软件sscom

https://files.cnblogs.com/files/blogs/816987/SSCOM串口调试软件sscom5.13.1.exe.zip?t=1742984031&download=true

posted @ 2025-03-26 17:45  大沐沐沐  阅读(81)  评论(0)    收藏  举报