Да! Не сдавайся в своем эфире пока Jbu.
Мы говорим о последовательной связи здесь. Для последовательных устройств абсолютно ожидаемо, что -1 может / будет возвращен при чтении, но все же ожидается получение данных в более позднее время.
Проблема в том, что большинство людей привыкли иметь дело с TCP / IP, который всегда должен возвращать 0, если только TCP / IP не отключен ... тогда да, -1 имеет смысл.
Однако в Serial отсутствует поток данных в течение длительных периодов времени, а также «HTTP Keep Alive», или пульс TCP / IP, или (в большинстве случаев) нет аппаратного управления потоком. Но связь является физической, и все еще связана с "медью" и все еще отлично жива.
Теперь, если то, что они говорят, правильно, то есть: Serial должен быть закрыт на -1, тогда почему мы должны следить за такими вещами, как OnCTS, pmCarroerDetect, onDSR, onRingIndicator и т. Д ...
Черт возьми, если 0 означает, что он есть, а -1 означает, что его нет, тогда закрутите все эти функции обнаружения! : -)
Проблема, с которой вы можете столкнуться, может быть в другом месте.
Теперь перейдем к конкретике:
В: «Казалось, что будет отображаться только хвостовая часть данных второго события, а остальные отсутствуют».
A: Я собираюсь догадаться, что вы были в цикле, повторно используя один и тот же буфер byte []. 1-е сообщение поступает, еще не отображается на экране / log / std out (потому что вы находитесь в цикле), затем вы читаете 2-е сообщение, заменяя данные 1-го сообщения в буфере. Опять же, потому что я собираюсь угадать, что вы не сохраняете то, сколько вы читаете, а затем убедитесь, что вы сместили буфер хранилища на предыдущую сумму чтения.
В: «Я в конечном итоге изменил свой код, чтобы при получении события я вызывал if (inputStream.available ()> 0), а ((aByte = read ())> -1) сохранял байт ".
A: Браво ... там все хорошо. Теперь, ваш буфер данных находится внутри оператора IF, ваше 2-е сообщение не будет загромождать ваше 1-е ... ну, на самом деле, это было, вероятно, только одно большое (er) сообщение на 1-м месте. Но теперь вы прочтете все за один раз, сохраняя данные нетронутыми.
C: "... состояние гонки ..."
A: Аааа, хорошо, поймай всех козлов! Состояние гонки ... :-) Да, возможно, это было условие гонки, на самом деле, возможно, оно и было. Но это также может быть способ, которым RXTX очищает флаг. Снятие «флага доступности данных» может произойти не так быстро, как ожидается. Например, кто-нибудь знает разницу между read VS readLine в отношении очистки буфера, в котором ранее были сохранены данные, и повторной установки флага события? Я тоже. :-) И пока я не могу найти ответ ... но ... позвольте мне рассказать еще несколько предложений. Программирование на основе событий все еще имеет некоторые недостатки. Позвольте привести пример из реальной жизни, с которым мне пришлось столкнуться недавно.
- Я получил некоторые данные TCP / IP, скажем, 20 байтов.
- Итак, я получаю OnEvent для полученных данных.
- Я начинаю чтение даже с 20 байтов.
- Прежде чем я закончу читать мои 20 байтов ... я получаю еще 10 байтов.
- TCP / IP, однако, выглядит так, чтобы уведомить меня, о, видит, что флаг все еще установлен, и больше не будет уведомлять меня.
- Тем не менее, я заканчиваю читать свои 20 байтов (доступно () сказал, что было 20) ...
- ... и последние 10 байтов остаются в TCP / IP Q ... потому что я не был уведомлен о них.
Видите, уведомление было пропущено, потому что флаг все еще был установлен ... хотя я начал читать байты. Если бы я закончил байты, флаг был бы удален, и я получил бы уведомление для следующих 10 байтов.
Полная противоположность тому, что происходит сейчас с вами.
Итак, перейдите к IF IF () ... прочитайте возвращенную длину данных.
Затем, если вы параноик, установите таймер и снова вызовите available (), если там все еще есть данные, тогда выполните чтение без новых данных. Если available () возвращает 0 (или -1), то расслабьтесь ... откиньтесь на спинку ... и дождитесь следующего уведомления OnEvent.