powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблема с ByteBuffer
7 сообщений из 7, страница 1 из 1
Проблема с ByteBuffer
    #38808821
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,Уважаемы Форумчане.

Разрабатываем очередной кроссплатформенный драйвер для очередной модели весов.
Есть определённое успешно эксплуатируемое в продакшине некое клише("рыба-шаблон") для драйвера:

1.Весы в comport отправляют цепочку байт(где содержится информация о весе цене устойчивости и т.д).
2.Они(байты ) кладутся в ByteBuffer
3.Далее в другом потоке парсер в соответствии с протоколом весов распознают нужную информацию и отправляет её в OC.
4.И далее ByteBuffer очищается методом clear

Многое оборудование так успешно работает.
Но вот появилось оборудование которое просто спамит в rs-232. (4-5 раз в секунду и по 128 байт).

Тех.условия подбираются так чтобы один "выхлоп"(пакет) весов равнялся 1/4 ByteBuffer limit.(Впрочем этот показатель не так важен) Главное,что парсеру п3 может прийти на анализ несколько "выхлопов"(пакетов).
и парсер последний(старший) пакет анализирует.


И 2-3 часа драйвер работает правильно,а потом начинает проскальзывать старые данные.(как будто бы clear не было)
Трассируем.смотрим что поступает из rs-232 b и это же пишем в ByteBuffer делаем println.
Потом смотрим что парсит и выясняется
(Напоминаю...это через пару часов работы)
Пришло <пакет с весом 1>
Должно быть в ByteBuffer(и так и есть первые часы)
<пакет с весом 1>0x00 0x00 000000000000(до лимита)

а после 1.5-3часов работы
<пакет с весом 1><пакет с весом старым>0x00 0x00 0000000(до лимита)
НЕ ВСЕГДА...а где-то каждую 100-150 итерацию.
(Т.е это мерцающая поломка...что называется ужас инженера)

читаю статью
http://stackoverflow.com/questions/11197875/fast-erase-not-clear-a-bytebuffer-in-java
там рекомедуют bytebuffer.put(byte[])

Делаем ByteBuffer.clear();bytebuffer.put(byte[]);
Наработка на сбой возрасла до 12 часов .(От 12 до 15)...Но всё равно лажа.

Читаю документацию
https://docs.oracle.com/javase/7/docs/api/java/nio/Buffer.html#clear()

Написано вот это.
This method does not actually erase the data in the buffer, but it is named as if it did because it will most often be used in situations in which that might as well be the case.

Давайте сверим позиции.
This method does not actually erase the data in the buffer

Это я перевожу как метод фактически не удаляет данные из буфера(Тут у меня вообще "взрыв мозга"....а нафиг он вообще этот метод нужен).

Воторую часть я так и не смог точнг перевести
, but it is named as if it did because it will most often be used in situations in which that might as well be the case.
Какой-то набор слов "типа это иметь место". :-)

Вот...у кого какие будут соображения.?
...
Рейтинг: 0 / 0
Проблема с ByteBuffer
    #38808832
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я помню NIO API, подготовку к записи новых данных после считывания уже имеющихся делает Buffer.flip()
Проще всего сделать два буфера, чтобы не возиться с переходом на начало буфера, когда считываются данные "у верхней границы".
...
Рейтинг: 0 / 0
Проблема с ByteBuffer
    #38808840
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно, кстати, обернуть в байтовые буферы два региона одного массива - тогда этот массив станет циклическим буфером.
...
Рейтинг: 0 / 0
Проблема с ByteBuffer
    #38808847
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваша проблема возникает, скорее всего, как раз из-за использования clear().
Если между очередными чтениями устройство успеет "накидать" больше данных, чем может поместиться в буфера - возникнет переполнение, которое вы не обрабатываете.
"По моему так" (ц) Винни-Пух
...
Рейтинг: 0 / 0
Проблема с ByteBuffer
    #38808865
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovВаша проблема возникает, скорее всего, как раз из-за использования clear().
Если между очередными чтениями устройство успеет "накидать" больше данных, чем может поместиться в буфера - возникнет переполнение, которое вы не обрабатываете.
"По моему так" (ц) Винни-Пух

Не переполнения нет....Иначе бы owerflow exeption было бы.
Как правило я имею задел 4 пакета.
...
Рейтинг: 0 / 0
Проблема с ByteBuffer
    #38808871
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если не пользоваться:
Код: sql
1.
while (buf.hasRemaining())

, то зачем вообще NIO?
Если пользоваться, то в логически простом коде можно сделать массу логических же ошибок.
...
Рейтинг: 0 / 0
Проблема с ByteBuffer
    #38808901
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
irbis_alдля очередной модели весовчто за весы-то?
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблема с ByteBuffer
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]