Подтвердить что ты не робот

Блокировка закрытых ячеек Java

Я связываюсь с блоком управления спутниковой антенной через последовательное соединение.

Открытие соединения с последовательным устройством:

import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;

portIdentifier = CommPortIdentifier.getPortIdentifier(device);
serialPort = (SerialPort) portIdentifier.open(name, 
serialPort.setSerialPortParams(baudrate, databits, stopbits, parity);
serialPort.setFlowControlMode(flowMode);

bufferedReader = new BufferedReader(new InputStreamReader(serialPort.getInputStream()));
outputStream = serialPort.getOutputStream();

Если устройство становится недоступным, я должен очистить поток, прежде чем отправлять новые команды, как только устройство снова запустится. Но этот прозрачный метод для потока ввода/вывода блокирует, если устройство выключено. Также закрытие потоков или закрытие блоков SerialDevice.

Есть ли способ закрыть/очистить эти потоки или SerialDevice без блокировки?

bufferedRead.close(); // blocks until device is up again
outputStream.close(); // blocks until device is up again
serialPort.close(); // blocks until device is up again
4b9b3361

Ответ 1

Я видел этот пост пока, и у меня была такая же проблема, закрывая serialport при использовании пакета gnu.io, который также называется RXTX.

Это не окончательный ответ, а предложение альтернативного решения, которое я нашел.

RXTX имеет две проблемы, на мой взгляд, если не больше:

  • В зависимости от вашей среды IDE вам необходимо разместить для Mac: RXTXcomm.jar и librxtxSerial.jnilib и для ПК: RXTXcomm.jar, rxtxSerial.dll в корне проекта в вашем IDE или Java-коде, это зависит от IDE к IDE. Документация здесь не описывает, как это сделать, и в разных IDE, таких как NetBeans, IntelliJ, даже если я заработал ее как для Eclipse, так и для IntelliJ, но не для NetBeans. У него все еще есть другие болезненные проблемы.
  • В зависимости от вашей ОС, даже если этот пакет запущен и запущен, например, в Windows 8.1, проблема с закрытием порта. Единственное решение - перезагрузить IDE/консоль и снова подключиться. Вы можете безумно перезапускать вашу среду IDE каждый раз при разработке проекта.

Я потратил много времени на поиск решения, и нет правильного решения для закрытия порта, возможно, для Windows 8.1 и более поздних версий (не знаю о проблемах с закрытием другого окружения), поскольку пакет устарел и поддержка ограничен.

Поэтому я предлагаю перейти к большему пакету без головной боли под названием JSSC.

Вот простые данные чтения из последовательного порта с использованием JSSC:

public class Main {

    public static void main(String[] args) {
        SerialPort serialPort = new SerialPort("COM1");
        try {
            serialPort.openPort();//Open serial port
            serialPort.setParams(9600, 8, 1, 0);//Set params.
            byte[] buffer = serialPort.readBytes(10);//Read 10 bytes from serial port
            serialPort.closePort();//Close serial port
        }
        catch (SerialPortException ex) {
            System.out.println(ex);
        }
    }
}

И ya, он закрывает порт без проблем.

Примечание.. Это открытый ответ, если у кого-то есть соответствующий опыт, пожалуйста, внесите свой вклад, отредактировав ответ. Я видел, как люди задавали этот вопрос в Интернете и имели почти такую ​​же проблему с RXTX в целом и не нашли работоспособного решения для RXTX.

Я ответил другому парню с аналогичным ранее question в Stackoverflow.

Я хотел поделиться знаниями, которые у меня есть, это может быть полезно для тех, кто сталкивается с такой же проблемой. Это может сделать ваш день менее болезненным.