Как настроить сеанс 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 из консоли, вывод прокручивается вниз по экрану, а не освежает вверху.

Я вырыл текущие настройки 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 для интерпретации фида-формы как явного терминала?

  • Как скомпилировать файл .c
  • Ошибки запуска MySQL: ERROR 1005
  • Яркость экрана в Debian после сна / спящего режима на Macbook с графической картой Intel
  • выполнение скрипта после выхода из системы
  • Попытка удалить криптовые разделы из графического установщика debian
  • Является ли Ubuntu LTS бинарным, совместимым с Debian?
  • Как некоторые пакеты deb найдены dpkg-query, пока они еще не установлены?
  • Список пакетов с установленными вручную уровнями без их зависимостей
  • 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 - лучшая ОС в мире.