在Java中,从多个天平(这里我们假设是通过某种接口或设备获取数据)获取数据并将其存储到Redis中,通常涉及以下几个步骤:

  1. 设置Redis环境:确保你的Java项目已经引入了Redis的客户端库,如Jedis或Lettuce。
  2. 连接Redis:使用Redis客户端库建立与Redis服务器的连接。
  3. 获取天平数据:编写代码来从天平设备或接口获取数据。这可能涉及网络请求、串口通信或其他方式。
  4. 处理数据:对获取的数据进行必要的处理,如解析、格式化等。
  5. 存储数据到Redis:将处理后的数据存储到Redis中。你可以使用Redis的字符串、哈希、列表、集合等数据结构来存储数据。

下面是一个简化的示例,展示如何这些步骤:

1.pom文件

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.5.8</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.5.8</version>
        </dependency>

2.application.xml文件

# 串口配置,对应多个设备
serial:
  enabled: true
  ports: COM5,COM8 # 逗号分隔
spring:
  redis:
    host: localhost
    port: 6379
    password:
    database: 12
    timeout: 60000

3.后台代码

@Component
public class MySerialReader {

    @Value("${serial.ports}")
    private String ports; 
     @Autowired
     RedisTemplate<String,String> redisTemplate;
    public static Map<String, SerialPort> openedPorts;

    /**
     * 读数
     */
    public void read() {
        // 读数
        // 使用多线程执行串口读数
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        openedPorts.entrySet().parallelStream().forEach(entry -> {
            executorService.submit(()-> readCom(entry));
        });
    } 

    private void readCom(Map.Entry<String, SerialPort> entry) {
        SerialPort serialPort = entry.getValue();
        serialPort.setBaudRate(1200);
        serialPort.setNumDataBits(7);
        serialPort.setNumStopBits(SerialPort.ONE_STOP_BIT);
        serialPort.setParity(SerialPort.NO_PARITY);

        String port = entry.getKey();
        System.out.println("port: " + port);
        try {
            while (true) {
                Thread.sleep(1000);
                byte buffer[] = new byte[1024]; // 读取缓冲区
                int bytesRead = serialPort.readBytes(buffer, buffer.length);
                if (bytesRead > 0) {
                    System.out.println("source data:");
                    System.out.println(JSONUtil.toJsonStr(buffer));
                    // 将读取的字节转换为字符串
                    try {
                        String msg4 = new String(buffer, 0, bytesRead, StandardCharsets.US_ASCII);
                        System.out.println(DateUtil.formatTime(new Date()) + " msg4: " + msg4);
                        if (StrUtil.isNotBlank(msg4)) {
                            String key = "serial:" + port;
                            System.out.println("key: " + key + "  val: " + msg4);
                            // 存入redis 时效5分钟
                            redisTemplate.opsForValue().set(key, msg4, 300, java.util.concurrent.TimeUnit.SECONDS);
                        }

                    }catch (Exception e){
                        e.printStackTrace();
                    }

                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            this.destroy();
            throw new RuntimeException("读串口数据失败,请检查设备连接");
        } finally {
            if (serialPort != null) {
                serialPort.closePort();
            }
        }
    }

    /**
     * 是否是active的
     * 是则继续执行,否则 destory, init
     *
     * @return
     */
    public boolean isActive() {
        return MapUtil.isNotEmpty(openedPorts)
                && openedPorts.values().stream().allMatch(SerialPort::isOpen);
    }

    /**
     * 串口连接初始化
     */
    public void init() { 
        if (MapUtil.isNotEmpty(openedPorts)) {
            // 如果全部的串口连接都是 open 状态 则无需重新连接
            if (openedPorts.values().stream().allMatch(SerialPort::isOpen)) {
                return;
            }
        }
        openedPorts = new HashMap<>();
        // 遍历,连接所有串口
        List<String> portList = StrUtil.split(ports, ",");
        for (String port : portList) {
            System.out.println("connect " + port);
            // 假设你知道要打开的串口名称,例如 "COM3"
            SerialPort serialPort = SerialPort.getCommPort(port);
            serialPort.openPort(); // 打开串口 
            openedPorts.put(port, serialPort);
            if (!serialPort.isOpen()) {
                throw new RuntimeException("串口连接失败,请检查设备连接或串口配置");
            }
        }
    }

    /**
     * 销毁,关闭连接
     */
    public void destroy() {
        if (MapUtil.isEmpty(openedPorts)) {
            return;
        }
        openedPorts.entrySet().parallelStream().forEach(entry -> {
            SerialPort serialPort = entry.getValue();
            if (serialPort != null && serialPort.isOpen()) {
                serialPort.closePort();
            }
        });
        openedPorts = null;
    } 

获取数据如下图:

java获取多个天平数据,存到redis中_串口

由于字符串是 N     +   7.7872 g ,  可以处理下只取数字

   String num = "N     +   7.7872 g";
   num = num.replaceAll("[^0-9.]", "");

注意:

  • 这个示例假设你已经有一个运行中的Redis服务器,并且它监听在localhost6379端口上。
  • 该方法是一个模拟方法,你需要根据实际情况来实现与天平设备的通信以获取数据。
  • 在实际应用中,可能需要考虑异常处理、连接池管理、数据持久化等问题。