从串口读取整个消息

时间:2018-09-23 20:43:10

标签: java serial-port

我有一个通过串行端口每5s发送一次控制消息 #2214 的框,但是当发生某些情况时,该框会向我发送预期的消息,例如。 $ 22021CB47E06B9B97BA56600 ,我需要使用此“美元信息”,但我需要整个信息。当我从Java运行代码时,框的输出看起来像

  

可用6

     

#2214

     

可用1

     

可用7

     

#2214

     

可用1

     

$

     

可用14

     

22021CB47E06B9

     

可用12

     

B97BA56600

     

可用4

     

#221

     

可用3

     

4

如果您不知道消息的大小,这是一种如何等待所有字节的方法? 我的代码有一部分。我尝试了很多方法。感谢您的帮助。

public static class SerialReader implements Runnable {

    InputStream in;
    SerialPort comPort;

    public SerialReader(InputStream in, SerialPort comPort) {
        this.in = in;
        this.comPort = comPort;
    }

    @Override
    public void run() {
        comPort.addDataListener(new SerialPortDataListener() {

            @Override
            public int getListeningEvents() {
                return SerialPort.LISTENING_EVENT_DATA_AVAILABLE;
            }

            @Override
            public void serialEvent(SerialPortEvent event) {
                try {
                    StringWriter sw = new StringWriter();

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

                    int i = 0; 
                    while ((i = in.available()) > 0) {
                         byte[] readBuffer = new byte[i];
                        in.read(readBuffer);
                        System.out.println("AVAILIBLE "+i);
                        System.out.println(new String(readBuffer));
                    }
                } catch (IOException ex) {
                    Logger.getLogger(SerialPortReader.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
    }
}

1 个答案:

答案 0 :(得分:0)

结果是使用BufferedReader br = new BufferedReader(new InputStreamReader(InputStream)而不是经典的InputStream,但是此解决方案会引发超时异常,因为超时默认情况下设置为0。所以我添加了READ_TIMEOUT,一切正常。

public void connect(String portName) throws Exception {
    SerialPort serialPort = availiblePorts().get(portName);
    if (serialPort.isOpen()) {
        System.out.println("Error: Port is currently in use");
    } else {
        serialPort.openPort(2000);
        serialPort.setComPortParameters(9600, 8, 1, 0);
        serialPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_BLOCKING, 500, 0);

        InputStream in = serialPort.getInputStream();

        (new Thread(new SerialReader(in))).start();
    }
}

This is usage example from JSerialComm