LINUX.ORG.RU

Регистрация асинхронных сообщений с последовательного порта.


0

0

Как возможно реализовать? Проблема в том, что основной обмен сигналами у меня происходит как бы синхронно: компьютер отправляет сигнал, ждет ответа, обрабатывает ответ. Однако, возникла необходимость получать асинхронные сигналы (с концевиков).

Сейчас сигналы регистрируются в начале каждой итерации бесконечного цикла потока, работающего с rs232. Однако при этом тело цикла иногда выполняется достаточно долго, чтобы 1-2 сигнала с порта «потерялись». Запустить отдельный поток, только читающий данные с порта и буферизующий их (например, отправляющий в трубу), скорее всего не получится - я думаю, он будет мешать записи в порт, да и получится неразбериха с чтением ответов на каждый записанный сигнал.

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

☆☆☆☆☆

Однако при этом тело цикла иногда выполняется достаточно долго, чтобы 1-2 сигнала с порта «потерялись».

А что ж такое в этих циклах делается, другое I/O?

В контроллере все реализуется намного проще: там есть прерывания...

А здесь есть select...

vga ★★
()

>Однако при этом тело цикла иногда выполняется достаточно долго

Если большую часть времени процесс находится в состоянии ожидания каких-то других событий, то проблему скорее всего можно решить через poll+«конечные автоматы».

Если длительное время идут именно активные вычисления, то тут ИМХО никак без дополнительной нити не обойтись.

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

А здесь есть select...

select'ом и пользуюсь (жду до 0.5 секунды поступления данных), но иногда итерация затягивается на 1-2с, и асинхронные сообщения отправляются в Лету.

pathfinder

Почитай про SIGIO/SIGPOLL... Есть ещё вроде Asynchronous Notification...

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

(Пошел читать Стивенса).

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от pathfinder

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

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от pathfinder

Похоже, не поддерживается - в документации ничего такого нет. Почти решил задачу путем внедрения проверок и перепроверок, где только можно.

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

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

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

Спасибо, оказывается, надо не вызывать ioctl(comfd, I_SETSIG, S_INPUT), а использовать sigaction. Правда, я уже в этом проекте переписал код, чтобы асинхронных сообщений не было вообще. Но на будущее может пригодиться (если не получится полностью перейти на CAN-интерфейс).

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от pathfinder

веб-интерфейс управления оптоволоконным спектрографом для УрГУ. Сам спектрограф сегодня забрали, отлаживаю на макетке. Осталось разобраться с управлением затвором (должно быть реализовано как ручное управление, так и управление от контроллера матрицы) и управлением фокусировкой кэноновского объектива.

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

>select'ом и пользуюсь (жду до 0.5 секунды поступления данных), но иногда итерация затягивается на 1-2с, и асинхронные сообщения отправляются в Лету.

Так на что уходят эти 1-2 секунды, я ж спрашивал выше? Что-то мне не верится, что на вычисления, поэтому предполагаю, что на I/O. А если на I/O - то нужно все IO делать через select.

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

Да ладно... Уже избавился от асинхронных сообщений. А уж если вдруг понадобится - буду через select делать паузы (т.к. сигналы sleep сбрасывают), а при помощи sigaction настрою порт на генерирование сигналов при поступлении данных.

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

>Это время уходило на sleep/usleep, необходимые для того, чтобы подвижки закончили перемещение.

ИМХО в данном случае «select/poll/epoll»+«конечные автоматы» подойдут намного лучше чем потоки,асинхронные сообщения или sleep/usleep.

pathfinder ★★★★
()

В общем, я полностью отказался от асинхронных сообщений (когда на одном rs-232 висит 8 контроллеров от асинхронных сообщений может быть больше вреда, чем пользы). Теперь все работает, как часы :) Осталось только допилить сервис авторизации, чтобы указывать у кук пути (иначе получается аутентификация на весь сайт, а не на отдельный сервис) и сохранять по нескольку кук на сервис (если на одной и той же страничке несколько разных HTTP_REFERER'ов). Ну, и взломать управление объективом Canon (на это у меня еще неделя-другая есть). Но это уже отдельная песня.

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