LINUX.ORG.RU

Как сбросить входящий через tty пакет на середине чтения?

 , ,


0

2

Во время чтения из tty (побайтово) входящего пакета обнаруживается что пакет содержит ошибку или еще какую нибудь лабуду. Как сбросить/отменить оставшееся непрочитанное содержимое пакета (очистить входящий буфер или что-то вроде того) для отправки исходящего пакета или для дальнейшего прослушивания порта на предмет следующего входящего (пакета) запроса?

В моем случае пакеты ModBus.

★★★

если не знаешь длину - выстави таймаут и читай только столько, сколько прочтётся без блокировки

mittorn ★★★★★
()
Ответ на: комментарий от mittorn

Большое спасибо, но я теперь и сам нашел более подходящее, на мой взгляд, решение - TCFLSH для ioctl() или tcflush() в termios.h.

normann ★★★
() автор топика

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

Silerus ★★★★
()
Ответ на: комментарий от Silerus

не понял вы же читаете посылку целиком

Нет, размер пакета заранее не известен. Задача стоит только на принимающей стороне.

normann ★★★
() автор топика
Ответ на: комментарий от normann

ну все равно, в заголовке пакета третьим байтом должен идти ошибка, все дальше просто прочитываем 2 байта в пустую

Silerus ★★★★
()
Ответ на: комментарий от Silerus

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

normann ★★★
() автор топика
Ответ на: комментарий от normann

Под ошибкой подразумевается не код ошибки, не отчет об ошибке, а неправильное содержимое пакета, не соответствующее протоколу, мусор, или наводки.

Пока вы будете объяснять удалённой стороне, что пошёл мусор (а он может и пойти обратно в этот момент :) ) пройдёт столько времени, что проще проигнорировать данный пакет. А перезапрашивать придётся всё равно так и так. FIFO буферы небольшие, сбрасывать их можно, но они на передачу и приём раздельны и друг другу не мешают.

vodz ★★★★★
()
Ответ на: комментарий от normann

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

Silerus ★★★★
()
Ответ на: комментарий от Silerus

У pdu струтура четкая по которой сразу становится ясно если ошибка. Например недопустимые код операции или адрес регистра, тут уже сразу понятно что читать дальше нет смысла.

normann ★★★
() автор топика
Ответ на: комментарий от normann

ну допустим, хотя для этого есть crc, при таких идеях нет никакой гарантии что весь заголовок был прочтен верно, а данные запорченны, и что тогда. Ну допустим обнаружили что заголовок порчен - следовательно надо ресетить буффер, сколько вы потратите на это, закрыть устройство открыть настроит, быстрее дочитать 252 байта и отбросить, кроме того модбас обязан ответить если он понял что ему прислали, а его ответ это ошибка укороченный запрос. Можно не отвечать конечно, но тогда вы сами себя лишаете отладочной информации

Silerus ★★★★
()
Ответ на: комментарий от Silerus

Ненужно ничего закрывать, TCFLSH для ioctl() или tcflush() в termios.h. Короче говоря сброс входного буфера.

normann ★★★
() автор топика
3 ноября 2017 г.

Прошло время. Справедливости ради, хочу сказать, всё равно в итоге пришёл к тому о чем большинство тут говорили - читаю до таймаута, разбираю, контрольная сумма, игнорирую или отвечаю.

normann ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.