Как я настраиваю свою tty сессию, таким образом, что перевод формата '\f' символ очистит терминал?

Это не гарантируется. Некоторые опции конфигурации могут измениться, некоторые зависимости могут измениться, некоторая функциональность, которая упомянута опциями конфигурации, может измениться. Вы не должны полагаться на него.

3
13.01.2015, 19:55
5 ответов

Необходимо заменить символ перевода страницы (\f) с надлежащими Управляющими кодами ANSI.

Можно сделать это с GNU sed:

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

Подробно: \033[2J Ясный экран, \033[0;0H: Перейдите к pos 0,0

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

2
27.01.2020, 21:17
  • 1
    я верю FPGA, не отправляет эти два символа backslash и f, но корректный служебный байт 0x0C. –  eppesuig 30.04.2013, 19:47
  • 2
    @eppesuig Да, но sed интерпретирует управляющие коды в своих аргументах. Таким образом, это действительно заменяет 0x0C. А-ч –  jofel 30.04.2013, 19:49
  • 3
    Как это использовалось бы? sed команда, собирающаяся возвратить результат stdout, таким образом, я использовал бы это в замене cat? –  stanri 30.04.2013, 20:00
  • 4
    @StaceyAnne Да, sed записи к stdout. Это ведет себя как cat: Это или читает из файла в его списке аргументов или от stdin. –  jofel 30.04.2013, 20:12
  • 5
    @jofel кажется, что sed не интерпретирует управляющий символ. Следующая команда показывает его: echo "\f" | sed 's/\f/formfeed received/g'. В Вашем примере это не должно соответствовать строке, в то время как это соответствует строке. –  eppesuig 30.04.2013, 20:26

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

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

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

1
27.01.2020, 21:17
  • 1
    . Вы делаете правильное замечание. Я использую LXDE и таким образом, LXterminal является тем, я использую большинство. Попытка echo -e "\f" в терминале не очищает экран, который объясняет, почему он не работал. Я попробовал xterm, LXterminal и терминал, который я получаю, когда я иду CTL-ALT-F1, который идентифицирует как "Linux" accoring к $TERM, и все три из тех не работают. –  stanri 30.04.2013, 19:53
  • 2
    По крайней мере, xterm страница руководства по xfree86.org/current/ctlseqs.html, кажется, разъясняется, в то время как в эмуляции VT100 перевод формата переводится в переводе строки. –  eppesuig 30.04.2013, 20:08
  • 3
    , я действительно хотел бы изменить режим, в котором работает xterm, но я не действительно уверен, как генерировать управляющие символы в xterm использование моей клавиатуры. Я попробовал ESC-[->-0, но я думаю, что я - путь от основы с этим. –  stanri 01.05.2013, 07:26

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

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

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

Лично, способ, которым я всегда делал это, должен просто отправить Управляющий код ANSI:

printf("\033[2J");

Я - вполне уверенный удар, интерпретирует это очень хорошо. И просто необходимо удостовериться, что включили совместимость ANSI/VT100 при использовании PuTTY или Гипертерминала.

1
27.01.2020, 21:17
  • 1
    , к сожалению, я ничего не могу сделать также, уточняет со стороны отправителя, потому что устройство отправителя является основанным на FPGA микроконтроллером, который я пытаюсь сохранить как можно меньше. Однако управляющий код ANSI определенно будет жизнеспособным вариантом, если я могу убедить stty включать ANSI (или еще лучше, если он включен по умолчанию). PS: представьте себе видеть Вас на этой стороне мирового –  stanri 30.04.2013, 17:21
  • 2
    @StaceyAnne *отклоняет сторону, не должен испытывать затруднения из-за кодов ANSI. Это обычно - сторона Windows, которая требует дополнительной конфигурации. Хотя это могла бы быть хорошая идея сделать stty term=vt100. И я отчасти предположил, что Вы будете происходить из FPGA ;-) Я полагал, что Вы сможете пользоваться крупной библиотекой, но включали ее для создания более полного ответа. –  embedded.kyle 30.04.2013, 17:49
  • 3
    интерпретирует Ctrl-L: Если Вы вводите Ctrl-L и существует выполнение удара, то это очищает экран. Но здесь, Ctrl-L (\f) не нажатие клавиши, и оно не интерпретируется ударом. –  Uwe 30.04.2013, 18:32
  • 4
    @Uwe я понимаю. Но я могу получить то же поведение с echo -e "\f". Хотя я не полностью понимаю механизм, которым, делает так. Это говорит удару интерпретировать управляющий код как нажатие клавиши Ctrl? –  embedded.kyle 30.04.2013, 19:04
  • 5
    @embedded.kyle нет, кажется, что Ваша терминальная программа получает Ctrl-L и реагирует путем очистки экрана. Вероятно, это не проблема удара. Я не могу воспроизвести это поведение с ударом, работающим или в xterm или в консоли. Какую терминальную программу Вы используете? –  Uwe 30.04.2013, 19:19

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

0
27.01.2020, 21:17
  • 1
    я попробовал minicom и это ничего не отобразило. Моя команда была minicom -o -D /dev/ttyACM0 -b 115200. -o корректный способ обойти модемную инициализацию? –  stanri 01.05.2013, 05:46
  • 2
    Эти настройки совпадают с показанный от Вашего первого stty команда, таким образом, да, они кажутся правильным. minicom показывает состояние последовательной линии (соединенный или разъединенный)? Это состояние изменяется при разъединении последовательного кабеля от преобразователя USB? –  eppesuig 01.05.2013, 09:49
  • 3
    я действительно устанавливал с minicom -s и добавил дополнительные строки к конфигурации для отключения модемной инициализации. если я работаю cat /dev/ttyACM0 работает. Затем я работаю minicom который дает "Онлайн" внизу, с корректными настройками, но никакими данными. CTRL-A X выходы minicom. затем cat больше не работает :(. Кабельное удаление переключается от Online кому: Offline как ожидалось, но minicom не восстанавливается с установки кабеля сразу же. Должен был выйти из minicom и повторной попытки для него для обнаружения порта снова. Найденный им на повторной попытке ~3rd. кошка –  stanri 01.05.2013, 10:05
  • 4
    восстанавливается с кабельным удалением и реинтеграцией, которую я вообразил бы сбросами независимо от того, что буфер запутывается. Очень исчерпывая идеи в этой точке. –  stanri 01.05.2013, 10:08
  • 5
    К сожалению, у меня нет никаких других предложений около проверки всех последовательных настроек. –  eppesuig 02.05.2013, 00:10

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

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

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

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

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

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

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

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

Дополнительная литература:

1
27.01.2020, 21:17

Теги

Похожие вопросы