Как установить тайм-аут в Java при чтении из SerialPort? - PullRequest
0 голосов
/ 26 марта 2012

Я новичок в программировании на JAVA.Мне было поручено написать приложение JAVA GUI, которое будет взаимодействовать с внешними устройствами через последовательный порт.Мне удалось заставить мой код компилироваться и запускаться с помощью пакета jSSC (Java Simple Serial Connector) как на Mac OS X, так и на платформе Win32.Проект jSSC предоставляет приличные примеры кодов, и его довольно легко реализовать с помощью интерфейса SerialPortEventListener в стиле javax.comm.

Но вскоре я понял, что мне нужно добавить функцию "ACK timeout" в мою реализацию, дляпредотвращение ошибок.В языке Си это может быть легко достигнуто с помощью вызова API select () с 5-м параметром, динамически устанавливающим желаемую длительность.Но в JAVA я не имею ни малейшего понятия, как это сделать.

Должен ли я установить другой поток времени и запустить событие, сгенерированное таймером, напрямую вызывая метод serialEvent ()?Это может привести к некоторым гоночным условиям.


(27.03. 10:43 Редактировать): ОК, я проследил исходный код jSSC.Казалось, что jSSC просто создает новый поток Runnable в JVM, когда в него зарегистрирован прослушиватель;и этот поток будет непрерывно опрашивать состояние с помощью вызова собственной функции, который будет вызывать системные вызовы API, такие как ioctl ().Так что было бы невозможно добавить событие тайм-аута без изменения собственной библиотеки.

Думаю, мне нужно изменить способ обработки событий последовательного порта.Мне нужно будет создать другой поток Runnable для обработки входящего процесса данных, вместо непосредственного анализа данных в вызове метода serialEvent () из потока событий jSSC.И я могу настроить таймер для выброса события тайм-аута в этот поток.

В этом случае мне нужно будет настроить поток диспетчеризации событий, как SwingUtility.invokelater ().Но я понятия не имею, должен ли я реализовать его снизу вверх, или я могу просто использовать AWT EDT для его обработки.

Может кто-нибудь дать мне какой-нибудь совет?

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Я не знаком с jSSC, но когда нет возможности передать тайм-аут через API и вам нужно сделать это самостоятельно, тогда ThreadMonitor от Apache может вас заинтересовать.

Использование выглядит так:

long timeoutInMillis = 1000;
try {
    Thread monitor = ThreadMonitor.start(timeoutInMillis);
    // do some work here
    ThreadMonitor.stop(monitor);
} catch (InterruptedException e) {
    // timed amount was reached
}

Мы используем RXTX здесь для связи через последовательный порт. У нас есть сканеры штрих-кода, подключенные через последовательный порт, и модемы, отправляющие SMS-сообщения нашим администраторам, когда в ходе мониторинга возникают критические состояния системы. Работает безупречно.

1 голос
/ 26 марта 2012

Я работал с java comm, никогда с jssc. JavaComm предоставляет открытый метод, в котором можно настроить время ожидания:

serialPort1 = (SerialPort) portId1.open("ComControl", 2000);

Из jssc javadoc метод open не управляет механизмом тайм-аута.

...