Java serialport закрыть блоки - PullRequest
22 голосов
/ 12 мая 2011

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

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

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

1 Ответ

3 голосов
/ 09 августа 2015

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

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

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

  1. В зависимости от вашей среды IDE для Mac: RXTXcomm.jar и librxtxSerial.jnilib и для ПК: RXTXcomm.jar, rxtxSerial.dll в корне проекта в вашей среде IDE или Java-коде, это зависит от среды IDE. в IDE. Документация здесь не описывает, как это сделать, и в различных IDE, таких как NetBeans, IntelliJ, даже если я заставил его работать как с Eclipse, так и с IntelliJ, но пока не с NetBeans. У него все еще есть другие болезненные проблемы.
  2. В зависимости от вашей ОС, даже если вы запустили этот пакет и запустили его, в 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);
        }
    }
}

И да, порт закрывается без проблем.

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

Я ответил другому парню с похожим ранее вопросом в Stackoverflow.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...