2012-02-10 2 views
1

Я читаю серийное устройство с использованием встроенного linux (angstrom) с использованием open(), tcget/setattr(), read(). Я могу читать и писать данные просто отлично. Однако устройство, которое я читаю, отображает приглашение, которое не завершается новой строкой. Это означает, что я не могу прочитать приглашение до тех пор, пока я не приведу к тому, что устройство отправит какой-либо другой результат, который имеет новую строку в конце. В принципе, я знаю, что строка приглашения («COM3>») сидит в буфере tty, ожидая, когда устройство отправит новую строку. read() не будет обращаться к строке приглашения «COM3>» до появления новой строки. Есть ли способ изменить силу read(), чтобы получить данные в буфере до прибытия новой строки?Как я могу прочитать вход терминала на устройстве tty до появления новой строки?

Благодаря

+0

Терминальный вывод никогда не зацикливается на уровне драйвера tty. Я подозреваю, что вы используете stdio, и именно там происходит буферизация. Либо используйте низкоуровневые io ('write') или' fflush' или 'setbuf' для отключения буферизации. –

+1

@R .: Это не так. В каноническом режиме, по умолчанию, терминальное устройство буферизируется по строке. – caf

+0

** Вход ** буферизируется в каноническом режиме. Выход нет. Теперь, когда вы упомянули об этом, вопрос OP действительно неясен относительно того, какая часть (вход или выход) работает не так, как ожидалось ... –

ответ

3

В каноническом режиме, который по умолчанию, вход линейный буфер.

Возможно, вы хотите установить терминал в «сырой» режим с cfmakeraw(), который (помимо прочего) отключит канонический режим.

Для получения дополнительной информации см. Справочную страницу tcsetattr().

+0

Я помню, как это делалось с вызовом ioctl(), который еще ниже. – Joshua

+0

@Joshua: «cfmakeraw()» - это просто вспомогательная функция, которая модифицирует «struct termios», вам все равно придется передать указатель на эту структуру в ядро, чтобы она вступила в силу. Вы можете либо сделать это с помощью 'TCSETS'' ioctl() 'или с помощью' tcsetattr() '- последняя является просто удобной оболочкой вокруг первой. – caf

+0

Обратите внимание, что 'cfmakeraw' также не является стандартизированной функцией, хотя широко поддерживается .. –

-1

Одним из преимуществ C является то, что существует 100 способов сделать что-либо.

я бы не использовать IOCTL, если бы И.

Простой cMyChar = ЕОКП (STDIN) будет делать красиво.

+0

Это ничего не делает. read() будет блокироваться до новой строки. – Joshua

+0

Как пояснение, я не должен был говорить «Терминал» в вопросе. Я не пытаюсь читать STDIN. Я пытаюсь прочитать другое устройство tty. – user171178