Как настроить сеанс tty таким образом, чтобы символ перевода страницы `\f` очищал терминал?

Как настроить сеанс 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).

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

решение1

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

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

где ^Lи ^[являются литеральными управляющими символами для form-feed controlLи escape control[. Вы можете вставить их в файл, используя vi(для вставки escape-символа, первый тип controlV).

Последовательности выхода используются для

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

Несколько заметок:

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

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

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

решение2

Вам необходимо заменить символ перевода страницы ( \f) на правильныйEscape-коды 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')

EDIT: как@MarkReel прокомментировал, вы можете использовать для не-GNU версии sed (например, BSD sed) экранированные строки ANSI:

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

решение3

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

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

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

решение4

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

Связанный контент