2010-07-30 4 views
0

Я новичок в разработке драйверов для Linux .... Я разрабатываю SMS-драйвер (AT-команды через последовательный порт для модема), используя TTY для доступа к последовательному порту. Драйвер написан на C.Драйвер, управляемый прерываниями, с использованием TTY?

В конструкции сообщений от модема драйвера может быть вызвано двумя событиями:

1) Состояние, как реагировать на AT команд, выдаваемых драйвером (т.е. ожидаемые сообщения)

2) Индикация новых SMS (т. Е. Неожиданных сообщений)

Я планирую два потока - один для записи в TTY и один для чтения из TTY. Можно ли настроить TTY так, чтобы мой read-thread просыпался по входящим символам (т. Е. Read-thread инициировался событиями и не основывался на опросе)?

С наилучшими пожеланиями, Витек

+0

Дополнительный комментарий: Я использовал «Последовательный Руководство по программированию для операционных систем POSIX» (HTTP: // WWW. easysw.com/~mike/serial/serial.html), но не нашел ответа на мой вопрос. – Witek

+0

Что вы хотите, так это то, как обычный 'read()' работает в нормальном, блокирующем дескрипторе файла - он будет спать до тех пор, пока данные не будут доступны для чтения (или сигнал пойман или другое исключительное условие). – caf

ответ

2

Я не думаю, что вы действительно хотите две темы. Типичный поток программы (запись команды AT, проверка ответа и т. Д.) Будет проще записывать и отлаживать в монотонной программе.

Ожидание символов может быть сделано с select(). Уровень tty в основном сконфигурирован через tcsetattr, tcgetattr и системный вызов друзей. С помощью этого вызова вы можете настроить, что вы хотите прервать на новой строке или на каждом символе, например. См. Man termios для man-страницы. Два больших варианта: вы хотите, чтобы специальные символы, такие как EOF, EOL Ctrl-C и т. Д. ... для обработки имели данные (raw mode) или интерпретировались слоем tty (канонический режим).

Смотрите часть на выбор в серийном руководство по программированию, или выберите справочную страницу для получения дополнительной информации

+1

Согласовано - однопоточное должно быть хорошо. Используйте 'select()' для блокировки до тех пор, пока данные не будут доступны ни из последовательного порта, ни из любых клиентов, которые есть у вашего драйвера, а затем 'read()' данные и справиться с ним. – caf

Смежные вопросы