Чтение последовательного порта в Java

Добавить таймер, который срабатывает после определенного интервала времени ожидания

Объявить константу для интервала времени ожидания и свойство для таймера

private let timeoutSeconds = 30
private var timer : DispatchSourceTimer?

и написать две функции для запуска и остановки таймер.

fileprivate func startDispatchTimer()
{
    let interval : DispatchTime = .now() + .seconds(timeoutSeconds)
    if timer == nil {
        timer = DispatchSource.makeTimerSource(queue: DispatchQueue.global())
        timer!.schedule(deadline:interval)
        timer!.setEventHandler {
            // do something when the timer fires
            self.timer = nil
        }
        timer!.resume()
    }
}

fileprivate func stopDispatchTimer()
{
    timer?.cancel()
    timer = nil
}

Запустите таймер после инициализации экземпляра сервера и остановите его в случае успеха. В случае неудачи добавьте код в закрытие setEventHandler для обработки тайм-аута, например, для освобождения экземпляра сервера.

9
задан informatik01 27 August 2014 в 13:22
поделиться

3 ответа

Используйте следующее:

while (inputStream.available()>0) {
  int numBytes = inputStream.read(readBuffer);
  System.out.print(new String(readBuffer));
}

Вы печатаете результат из цикла с условием продолжения. Однако код в цикле может работать несколько раз, таким образом, блок данных будет потерян.

4
ответ дан 4 December 2019 в 21:52
поделиться

Попытайтесь сбросить входной буфер порта прежде, чем сделать Ваше чтение. Иначе, если передающий конец отправил данные во время запуска Вашей программы (или тесно прежде, который мог бы быть до операционной системы), Вы получите старые буферизированные данные.

Кроме того, если это возможно, рассмотрите добавляющее структурирование сообщения к протоколу, таким образом, можно обнаружить при чтении чего-то, что не является, на самом деле, полным сообщением, и отбросьте его. Это часто очень полезно с этими видами проблем.

3
ответ дан 4 December 2019 в 21:52
поделиться

Это смотрит, как будто Вы читали остальную часть некоторого сообщения, которое было отправлено перед запуском.

Попытайтесь считать как можно больше данных, поскольку Вы запускаете программу для очистки любых аппаратных буферов. После этого запустите свою обработку.

2
ответ дан 4 December 2019 в 21:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: