LINUX.ORG.RU

Работа с com-портом. Чтение с блокировкой.


0

0

Есть проблемка одна: пишу драйвер для устройства, которое висит на последовательном порту. Оно юзает только линии данных на порту. Работа такая: запрос - ответ. Причём, после запроса должно пройти нормальное время (~50мсек) для того, чтобы появился ответ.

Пользую "non-canonical" (типа raw) режим работы с портом, но мне нужно, чтобы вызов read() блокировался, пока не придёт нужное кол-во данных в порт. Это необходимое количество данных не постоянно и варьируется от запроса к запросу.

Два варианта решения этой проблемы (как я вижу): -делать write() -- запрос, потом спать 50-60 мсек и читать read().

-делать write() потом менять newtio.c_cc[VMIN] на нужное кол-во байт, делать tcsetattr() и потом только читать, тогда read() заблокируется.

Но, ведь в вызове read() мы указываем последним параметром нужное кол-во символов. Нельзя ли как-нить обойтись без выставления каждый раз режима работы порта и сделать так, чтобы read() блокировался каждый раз?


Помоему проще сделать для чтения отдельную ф-цию, передавать ей количество байт которые нужно принять а она пусть их читает в цикле побайтно в блокирующем режиме.

koTuk
()

Да, кстати - а зачем спать 50-60 мск ? :) Читай сразу после записи - в блокирующем режиме пока он не прочитает все равно никуда не денется - будет ждать.

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

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

Хотя, конечно, можно и так и так попробовать...

Не знаю, что хуже, почти каждый раз (когда надо поменять размер принимаемых данных) делать переустановку параметров com-порта, либо делать побайтовое чтение...

один вызов tcsetattr(), или 10-15 вызов read()....

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

>не будет ли быстрее и проще тогда просто один раз выставить сколько байт надо прочитать и всё...

Скороть порта одна и та же - как он может прочитать быстрей или медленней ?

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

Хотя, в любом случае загрузка системы этим будет минимальна, просто, думаю, логичнее было б прочитать, к примеру, 15 байт за раз, чем 15 раз по 1 байту.

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

>Re: Работа с com-портом. Чтение с блокировкой. >так в том то и дело, что он не блокируется, просто возвращает то, что принято 0 байт... Я не понял - открой файл устройства в блокирующем режиме.

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

+1

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

А вот читать с таймаутом (а не извращаться с бесконечным ожиданием либо тупо спать) - это принципиально для нормальной работы.

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