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

  • Как установить CentOS 7 поверх Debian jessie удаленно?
  • Запустить программу после завершения подключения ssh
  • Нужен ли мне специальный брандмауэр на персональном компьютере?
  • Apticron уведомляет об удаленных пакетах
  • Мышь мерцает в новой установке debian
  • xbacklight не работает
  • Не удалось подключить внешний USB-накопитель из-за GPT на debian
  • Установите последний GTK, не строя себя
  • 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
    Interesting Posts

    perl + uniq перед переменной

    проблемы печати с принтером DDST (aka PCL6) RICOH Aficio SP C240DN

    Утилита для отправки HTML-почты с вложениями в длинный список писем?

    Получение совместной работы VLC и Remmina

    Установка Overlayfs в пространстве имен пользователей

    Почему `du -sh *` жалуется на недопустимые параметры?

    Восстановить поврежденный загрузчик grub на Scientific Linux 6.3

    SUDO_USER undefined в руководстве sudo – разъяснение будет прекрасным

    Есть ли способ действительно приоритизировать процессы или заставить Linux уважать их приоритеты?

    извлекать только определенную папку Содержимое из архива с zip-файлом в данный каталог

    zsh не может содержать некорректные `$ *` и `$ @` равные

    Проблема с производительностью ввода-вывода диска

    Управление документами в автономном режиме на Linux-системе

    Как публиковать git-репо через HTTP с помощью nginx?

    Установленный Linux, теперь Windows больше не загружается

    Linux и Unix - лучшая ОС в мире.