springboot 使用jSerialComm 读取串口数据

依赖:


<dependency>
<groupId>com.fazecast</groupId>
<artifactId>jSerialComm</artifactId>
<version>${jSerialComm}</version>
</dependency>

代码: 


    private ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();


  public static synchronized SerialPortUtils getInstance() {
        if (instance == null) {
            instance = new SerialPortUtils();
        }
        return instance;
    }

    public SerialPort openPort(String portName, int baudRate, int dataBits, int stopBits, int parity) {

        if (serialPort == null || !serialPort.isOpen()) {
            serialPort = SerialPort.getCommPort(portName);
            serialPort.setComPortParameters(baudRate, dataBits, stopBits, parity);
            serialPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_SEMI_BLOCKING, 0, 0);
            serialPort.openPort();
        }
        return serialPort;
    }


    @Override
    public void executeOptimized(XXXPO xxxPO) {
        SerialPortUtils serialPortUtil = SerialPortUtils.getInstance();
        SerialPort comPort = null;
        try {

            comPort = serialPortUtil.openPort(xxxPO.串口, xxxPO。比特率, xxxPO.数据位, xxxPO.停止位,xxxPO.校验位);

            if (comPort == null || !comPort.isOpen()) {
          
                return;
            }

            comPort.addDataListener(new SerialPortDataListener() {
                @Override
                public int getListeningEvents() {
                    return SerialPort.LISTENING_EVENT_DATA_AVAILABLE;
                }

                @Override
                public void serialEvent(SerialPortEvent event) {

                    if (event.getEventType() != SerialPort.LISTENING_EVENT_DATA_AVAILABLE) {
                        return;
                    }

                    byte[] newData = new byte[event.getSerialPort().bytesAvailable()];
                    int numRead = event.getSerialPort().readBytes(newData, newData.length);

                    if (numRead > 0) {

                        byteArrayOutputStream.write(newData, 0, numRead); // 直接将读取到的数据写入ByteArrayOutputStream

                        // 打印二进制数据, 确定结尾是不是 \r \n的进制结尾,测试没问题可以删除
                        System.out.print("Received binary data: ");
                        for (byte b : newData) {
                            System.out.printf("%02X ", b); // %02X 表示以两位十六进制数打印,不足两位前面补0
                        }
                        System.out.println(); // 换行

                        // 检查并处理完整的行
                        processAccumulatedData();
                    }

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

    private void processAccumulatedData() {
        byte[] byteArray = byteArrayOutputStream.toByteArray();

        if(byteArray.length < 2){
            return;
        }

        // 确保数据以 \r\n 结尾,如果不是则认为是不完整的数据并直接返回
        if ( byteArray[byteArray.length - 2] != '\r' && byteArray[byteArray.length - 1] != '\n') {
            return;
        }

        String data = new String(byteArray, StandardCharsets.UTF_8);

        // 按照 \r\n 分割数据为多行
        String[] lines = data.split("\r\n");

        for (String line : lines) {
            // 处理每一行数据
            System.out.println("line: " + line);
            handler(line);
        }

        // 处理完数据后重置 byteArrayOutputStream 准备接受下一批数据
        byteArrayOutputStream.reset();
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值