Это не гарантируется. Некоторые опции конфигурации могут измениться, некоторые зависимости могут измениться, некоторая функциональность, которая упомянута опциями конфигурации, может измениться. Вы не должны полагаться на него.
Необходимо заменить символ перевода страницы (\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'
)
Когда Ваш FPGA выполняется print("\n\f")
это действительно отправляет два байта на своем stdout, первый является переводом строки, и второй является переводом формата. Эти байты являются 0x0A и 0x0C.
Затем stdout является trasferred по USB-кабелю, и читайте через эмулированное последовательное устройство. Это последовательное устройство будет просто trasfer оба байта к терминалу управления (потому что Вы читаете его через cat
команда), и в конечном счете к Вашему терминалу гнома, xterm или любой другой программе Вы используете. Этот эмулятор терминала должен понять оба байта и действие соответственно.
Так, необходимо проверить возможности эмулятора. Какой Вы используете?
echo -e "\f"
в терминале не очищает экран, который объясняет, почему он не работал. Я попробовал xterm, LXterminal и терминал, который я получаю, когда я иду CTL-ALT-F1, который идентифицирует как "Linux" accoring к $TERM, и все три из тех не работают.
– stanri
30.04.2013, 19:53
ESC-[->-0
, но я думаю, что я - путь от основы с этим.
– stanri
01.05.2013, 07:26
Я нашел много ссылок онлайн, которые говорят, что удар должен интерпретировать \f
как ясный экран. И так же, как многие говорящие это не работают.
Вы можете смешивать с Вашим stty
настройки, чтобы заставить это интерпретировать \f
правильно (который в этом контексте был бы записан как ^L
для Ctrl+L). Но я ничто не мог найти очевидным.
Обходное решение должно было бы изменить Ваш код. Но нет никакого легкого, межплатформенного способа очистить экран. Однако существует много способов выбрать из. Если возможно, можно связать в библиотеке проклятий и использовании это. Или stdlib.h и использование system()
.
Лично, способ, которым я всегда делал это, должен просто отправить Управляющий код ANSI:
printf("\033[2J");
Я - вполне уверенный удар, интерпретирует это очень хорошо. И просто необходимо удостовериться, что включили совместимость ANSI/VT100 при использовании PuTTY или Гипертерминала.
stty term=vt100
. И я отчасти предположил, что Вы будете происходить из FPGA ;-) Я полагал, что Вы сможете пользоваться крупной библиотекой, но включали ее для создания более полного ответа.
– embedded.kyle
30.04.2013, 17:49
\f
) не нажатие клавиши, и оно не интерпретируется ударом.
– Uwe
30.04.2013, 18:32
echo -e "\f"
. Хотя я не полностью понимаю механизм, которым, делает так. Это говорит удару интерпретировать управляющий код как нажатие клавиши Ctrl?
– embedded.kyle
30.04.2013, 19:04
Так как проблема о корректной эмуляции терминала ANSI, я думаю наилучший вариант, который Вы имеете, должен соединиться с последовательным к USB преобразователем с minicom
. Просто не забудьте открывать последовательное устройство, не инициализируя модем, т.е. не отправляя hayes команды на запуске.
minicom
и это ничего не отобразило. Моя команда была minicom -o -D /dev/ttyACM0 -b 115200
. -o
корректный способ обойти модемную инициализацию?
– stanri
01.05.2013, 05:46
stty
команда, таким образом, да, они кажутся правильным. minicom показывает состояние последовательной линии (соединенный или разъединенный)? Это состояние изменяется при разъединении последовательного кабеля от преобразователя USB?
– eppesuig
01.05.2013, 09:49
minicom -s
и добавил дополнительные строки к конфигурации для отключения модемной инициализации. если я работаю cat /dev/ttyACM0
работает. Затем я работаю minicom
который дает "Онлайн" внизу, с корректными настройками, но никакими данными. CTRL-A X
выходы minicom. затем cat
больше не работает :(. Кабельное удаление переключается от Online
кому: Offline
как ожидалось, но minicom не восстанавливается с установки кабеля сразу же. Должен был выйти из minicom и повторной попытки для него для обнаружения порта снова. Найденный им на повторной попытке ~3rd. кошка
– stanri
01.05.2013, 10:05
GNU sed не является необходимым для решения этой проблемы (хотя сценарий легче читать). Минимальный сценарий (протестирован с Solaris и OSX):
sed -e 's/^L/^[[H^[[J/g'
где ^ L
и ^ [
- буквальные управляющие символы для элемента управления подачей формы L и управление выходом [. Вы можете вставить их в файл с помощью vi
(для вставки escape-символа используйте элемент управления первого типа V ).
Управляющие последовательности используются для
^ [[H
и ^ [[J
Несколько примечаний:
^ [[H
] (и в любом случае позиции начинаются с 1 , а не с 0 ) и 2
, например ^ [[2J
], потому что это очищает весь дисплей. Значение по умолчанию ^ [[J
] очищается от текущей позиции до конца дисплея. Несколько нестандартных терминалов, например ansi.sys
, не делают этого различия. Некоторых смущает использование bash ^ L
в качестве сочетания клавиш для очистки экрана, а также интерпретация PuTTY для ^ L
(см. Почему не » t экран очищается, когда я набираю control / L? в XTerm FAQ).
Дополнительная литература:
backslash
иf
, но корректный служебный байт 0x0C. – eppesuig 30.04.2013, 19:47sed
команда, собирающаяся возвратить результат stdout, таким образом, я использовал бы это в заменеcat
? – stanri 30.04.2013, 20:00sed
записи кstdout
. Это ведет себя какcat
: Это или читает из файла в его списке аргументов или отstdin
. – jofel 30.04.2013, 20:12echo "\f" | sed 's/\f/formfeed received/g'
. В Вашем примере это не должно соответствовать строке, в то время как это соответствует строке. – eppesuig 30.04.2013, 20:26