Опросить последовательный порт в Java, чтобы получить текущее состояние устройства

Я использую javax.comm для связи через последовательный порт, и проблема, с которой я сталкиваюсь, заключается в том, что я не уверен, как опрашивать порт, чтобы получить текущее состояние моего устройства (матричный коммутатор 4x8) при запуске. Я могу красиво получить текущее состояние, когда состояние изменяется с помощью прослушивателя событий последовательного порта (т.е. я что-то записываю в порт, прослушиватель захватывает биты данных по мере их изменения).

Вот мой код для захваченных событий. Как я могу изменить это для опроса текущего состояния без фактического изменения состояния?

public void serialEvent(SerialPortEvent event) {
    waitingForResponse = true;
    System.out.println("Serial Event Detected: " + event.getEventType() + " Going to read buffer..");

    switch(event.getEventType()) {
    case SerialPortEvent.BI:
        System.out.println("Data Event: BI");
    case SerialPortEvent.OE:
        System.out.println("Data Event: OE");
    case SerialPortEvent.FE:
        System.out.println("Data Event: FE");
    case SerialPortEvent.PE:
        System.out.println("Data Event: PE");
    case SerialPortEvent.CD:
        System.out.println("Data Event: CD");
    case SerialPortEvent.CTS:
        System.out.println("Data Event: CTS");
    case SerialPortEvent.DSR:
        System.out.println("Data Event: DSR");
    case SerialPortEvent.RI:
        System.out.println("Data Event: RI");
    case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
        System.out.println("Data Event: OUTPUT_BUGGER_EMPTY");
        break;
    case SerialPortEvent.DATA_AVAILABLE:
        System.out.println("Data available in buffer..");
        //byte[] readBuffer = new byte[11];

        try {              
            StringBuilder readBuffer = new StringBuilder();

            try{
                int value;     
                int byteLengthCounter = 0;
                // reading just one at a time
                while (byteLengthCounter < 8) {

                    value = inputStream.read();
                    readBuffer.append((char) value);
                    currentState = new String(readBuffer);
                    byteLengthCounter++;
                }
                System.out.println("Successful read. Current state: " + getCurrentState());
                byteLengthCounter = 0;

                waitingForResponse = false;

            }catch(Exception e){System.out.println("Did not read buffer: " + e);}

        } catch (Exception e) {System.out.println(e);}
        break;
    } 

    try{
        System.out.println("Going to close steam..");
        if (inputStream != null)    inputStream.close();
        //System.out.println("Going to close port..");
        //if (serialPort != null) serialPort.close();

        }catch (Exception e){}
}

1 ответ

Спасибо, Джим, вы абсолютно правы, просто отправив строку запроса и получив ответ. Очень просто! Ответ на мой вопрос зависит от производителя и какой строки мне нужно было отправить на мое устройство. Каким-то образом я упустил это из виду в руководстве. Теперь я могу "опросить" устройство, чтобы вернуть его текущее состояние. Простой ответ! Спасибо за помощь.

Другие вопросы по тегам