1

У меня есть простое соединение ПК с платой с использованием последовательного интерфейса (9600, без контроля четности, 8 бит, без потока hw) Я открыл простой терминал * с тератермом) на ПК и ввел ключи в тератерме и на плате, просто

 cat /dev/tty05

Я вижу нажатые символы в области видимости, но вижу символы в консоли доски, только после нажатия "enter" в тератерме (как будто они хранятся в некотором FIFO в драйвере Linux, который вводит только триггеры)

почему символы принимаются в драйвере Linux только при нажатии клавиши ввода? Есть ли способ получить символы, не нажимая клавишу ввода? (мы используем некоторый протокол ascii, поэтому не имеет смысла отправлять его как пустышку) Спасибо за совет, Ран

2 ответа2

1

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

Терминал, вероятно, также в cooked морде. Вы можете отключить это, выполнив команду stty raw < /dev/tty05 перед запуском cat. Вы можете сбросить настройку с помощью команды stty sane < /dev/tty01 , хотя она может быть сброшена при закрытии терминала.

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

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

РЕДАКТИРОВАТЬ: Следующий скрипт Python демонстрирует чтение символов с терминального устройства по одному. Это требует, чтобы терминал находился в необработанном режиме, чтобы отключить буферизацию в драйвере терминала. Команда stty может использоваться для установки терминала в режиме raw, но эта программа делает это.

#!/usr/bin/python
import termios
import tty
with open('/dev/tty', 'rb') as f:
    fd = f.fileno()
    old_settings = termios.tcgetattr(fd)
    print "Enter characters (q to quit)"
    tty.setraw(fd)
    ch = ''
    try:
        while ch != 'q':
            ch = f.read(1)
            if not ch:
                print "End of file"
                break
            print "Read a character:", ch, '\r'
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
1

Спасибо, Билл. Кажется, ты направил меня к ответу. Это связано с "буферизацией строки", также называемой каноническим / неканоническим режимом, то есть также код чтения из uart может поддерживать или не поддерживать "буферизацию строки":

   In canonical mode:
   * Input is made available line by line.  An input line is available
     when one of the line delimiters is typed (NL, EOL, EOL2; or EOF at
     the start of line).  Except in the case of EOF, the line delimiter
     is included in the buffer returned by read(2).

   * Line editing is enabled (ERASE, KILL; and if the IEXTEN flag is
     set: WERASE, REPRINT, LNEXT).  A read(2) returns at most one line
     of input; if the read(2) requested fewer bytes than are available
     in the current line of input, then only as many bytes as requested
     are read, and the remaining characters will be available for a
     future read(2).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .