Как настроить сеанс tty таким образом, чтобы символ «\ f» фида формы очистил терминал?

Я подключаюсь к последовательному USB-соединению на / dev / ttyACM0. Код на стороне отправителя посылает символ \f через регулярные интервалы.

  print("----------------------------\n\r"); print("-- LED CONTROLLER 00.01 --\n\r"); print("----------------------------\n\r"); print("\n\f"); 

Однако, когда я запускаю cat /dev/ttyACM0 из консоли, вывод прокручивается вниз по экрану, а не освежает вверху.

  • Одновременное редактирование нескольких файлов с помощью vim / gedit
  • Отключить настройку громкости выше 100% в pulseaudio
  • Повторять повторяющиеся ключи
  • Как определить, какая версия OpenSSL установлена?
  • console-kit-daemon Hogging CPU и RAM
  • Создание обертки .sh в моем пакете debian
  • Я вырыл текущие настройки stty (набрав stty -F /dev/ttyACM0 -a ), который дает следующий результат:

     speed 115200 baud; rows 0; columns 0; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^A; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; -parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8 -opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 -isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke 

    Чтение stty --help страницы дает задержку подачи формы ( ff0 ), но не указывает, как изменить что-либо еще. Я также нашел эту страницу, которая указывает, что я могу установить символ FormFeed так, как FormFeed=014 , но этот синтаксис не работал для моей stty версии ( stty --version дает stty (GNU coreutils) 8.5 ).

    Штукатура в Windows демонстрирует правильное поведение, но я изо всех сил пытаюсь заставить ее работать в Debian 6. Кто-нибудь знает, как я могу настроить stty для интерпретации фида-формы как явного терминала?

  • apt-get подсказки для компакт-дисков при установке пакетов, как мне его остановить?
  • pm-utils: Нет сети для приостановки сценариев?
  • Не удалось apt-get обновить mariadb, но dist-upgrade работает? почему это?
  • Установка драйвера на ноутбуке Debian Squeeze
  • Почему backports называют backports?
  • Выделить файл с определенным смещением в ext3 / 4
  • 5 Solutions collect form web for “Как настроить сеанс tty таким образом, чтобы символ «\ f» фида формы очистил терминал?”

    Вам нужно заменить символ подачи формы ( \f ) на соответствующие коды отмены ANSI .

    Вы можете сделать это с помощью GNU sed :

     sed 's/\f/\o33[2J\o33[0;0H/g' /dev/ttyACM0 

    Подробнее: \033[2J Очистить экран, \033[0;0H : перейти в позицию 0,0

    (Если это не работает, попробуйте tail -f /dev/ttyACM0 | sed 's/\f/\o33[2J\o33[0;0H/g' )

    Когда ваш FPGA выполняет print("\n\f") он действительно отправляет два байта на своем stdout, первый – это перевод строки, а второй – formfeed. Эти байты: 0x0A и 0x0C.

    Затем stdout передается по USB-кабелю и считывается с помощью эмулируемого последовательного устройства. Это последовательное устройство будет просто транслировать оба байта на управляющий терминал (потому что вы читаете его с помощью команды cat ) и в конечном итоге к вашему gnome-терминалу, xterm или любой другой программе, которую вы используете. Этот эмулятор терминала должен понимать оба байта и действовать соответственно.

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

    Я нашел много ссылок в Интернете, которые говорят, что bash должен интерпретировать \f как ясный экран. И так же, как многие говорят, что это не работает.

    Возможно, вам удастся связать со своими stty настройками, чтобы заставить его правильно интерпретировать \f (что в этом контексте будет записано как ^L для Ctrl + L ). Но я не мог найти ничего очевидного.

    Обходным решением будет изменение вашего кода. Но нет простого, кросс-платформенного способа очистки экрана. Однако есть много способов выбора. Если возможно, вы можете связать в библиотеке curses и использовать это. Или stdlib.h и используйте system() .

    Лично, как я всегда это делал, просто отправьте код ANSI Escape :

     printf("\033[2J"); 

    Я почти уверен, что bash интерпретирует это просто отлично. И вам просто нужно обязательно включить совместимость ANSI / VT100 при использовании PuTTY или Hyperterminal.

    Поскольку проблема заключается в правильной эмуляции терминала ANSI, я думаю, что лучший вариант, который у вас есть, – это подключиться к преобразователю serial-to-USB с minicom . Не забудьте открыть последовательное устройство без инициализации модема, то есть без отправки команд hayes при запуске.

    GNU sed не является существенным для решения этой проблемы (хотя скрипт легче читать). Минимальный скрипт (тестируется с помощью Solaris и OSX):

     sed -e 's/^L/^[[H^[[J/g' 

    где ^L и ^[ – литеральные управляющие символы для управления подачей формы L и управления эвакуацией [ . Вы можете вставить их в файл с помощью vi (для вставки escape-символа, первого типа V ).

    Управляющие последовательности используются для

    • переместите курсор в исходное положение ^[[H и
    • очистить дисплей ^[[J

    Несколько примечаний:

    • нет необходимости указывать строку и столбец в escape- ^[[H (и в любом случае позиции начинаются с 1 , а не 0 ) и
    • если экран был очищен перед перемещением курсора, в побеге потребуется 2 , например, ^[[2J , потому что это очищает весь экран. По умолчанию ^[[J удаляется с текущей позиции до конца дисплея. Несколько нестандартных терминалов, например, ansi.sys , не сделали этого различия.

    Некоторых людей путают использование bash ^L для сокращения клавиатуры, чтобы очистить экран, а также интерпретацию PuTTY ^L (см. Почему экран не отображается, когда я набираю элемент управления / L? В FAQ XTerm).

    Дальнейшее чтение:

    • Последовательности управления XTerm
    • редактор sed-stream
    Linux и Unix - лучшая ОС в мире.