如果有数据,流如何返回零字节?

时间:2017-05-22 17:55:05

标签: javafx netbeans fxml rxtx

我正在研究一个RXTX项目。我有如下设置:

public void doConnect(ActionEvent event)
    {
        String selectedPort = (String)connectTabController.portList.getValue();
        System.out.println("Connecting to: " + selectedPort);
        selectedPortIdentifier = (CommPortIdentifier)portMap.get(selectedPort);
        CommPort commPort = null;
        try
        {
            commPort = selectedPortIdentifier.open("AT QC ReponseTime", TIMEOUT);
            serialPort = (SerialPort)commPort;
            setConnected(true);
            if (isConnected)
                    {
                        if (initIOStream() == true)
                                {
                                    initListener();
                                    System.out.println("Initializing listener");
                                    connectTabController.gui_changeStatusLabel("Device Connected!");
                                }
                    }
        }
        catch (PortInUseException e)
        {
            System.out.println("Port In use! " + e.toString());
        }

        catch (Exception e)
        {
                    System.out.println("Failed to open! " + e.toString());
        }
    }
    public boolean initIOStream()
    {
        //return value for whether opening the streams is successful or not
        boolean successful = false;

        try {
            //
            input = serialPort.getInputStream();
            output = serialPort.getOutputStream();
            writeData(RESETTPOD);
            System.out.println("Writing Reset command");

            successful = true;
            System.out.println("IO Stream opened successfully!");
            return successful;

        }
        catch (IOException e) {
            System.out.println("I/O Streams failed to open. (" + e.toString() + ")");
            return successful;
        }
    }


    public void initListener()
    {
        try
        {
            serialPort.addEventListener(this);
            serialPort.notifyOnDataAvailable(true);
        }
        catch (TooManyListenersException e)
        {
            System.out.println("Too many listeners. (" + e.toString() + ")");

        }
    }

这就是连接的方式,并且它有一个应该在数据可用时通知的侦听器,这会触发以下内容:

@Override
    public void serialEvent(SerialPortEvent evt) {

        BufferedReader reader = null;

        if (evt.getEventType() == SerialPortEvent.DATA_AVAILABLE)
        {
            try
            {
                reader = new BufferedReader(new InputStreamReader(input));

                if (reader.ready())
                {
                fullLine = reader.readLine();
                System.out.println(fullLine + "\n");
                }

            }
            catch (Exception e)
            {
                System.out.println("@SerialEvent Failed to read data. (" + e.toString() + ")");
            }
        }
}

然而,我一直在“输入输入流回归零点”

这没有任何意义,因为如果没有什么可读的话,那么听众就不应该首先被触发。我尝试运行应用程序,并且每隔1/3秒就会收到此错误消息,这对应于正在发送数据的设备的突发输出。 (在PuttY这样的程序中工作正常)

1 个答案:

答案 0 :(得分:0)

如果您打算使用BufferedReader,请查看javax.comm,CommPort和getInputStream的refence API文档。然后尝试使用不同的阈值设置并接收超时。

例如)。 serialPort.enableReceiveThreshold(3); serialPort.enableReceiveTimeout(1);

https://docs.oracle.com/cd/E17802_01/products/products/javacomm/reference/api/