Коды терминала Linux, состоящие из нескольких байт |
![]() |
Добавил(а) microsin | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Для организации консоли управления встраиваемыми устройствами через последовательный терминал необходимо обрабатывать специальные символы терминала и последовательности специальных символов. Ниже приведены основные управляющие коды (байтовые последовательности), которые посылает терминал SecureCRT в режиме эмуляции терминала Linux при нажатии на клавиши. Таблица кодов специальных клавиш (в HEX-формате):
Примечания: (1) По умолчанию нажатие Enter приводит к появлению в буфере символа CR (0x0D, \r). Если в свойствах сессии SecureCRT поставить галочку "New line mode" в разделе Emulation -> Modes, то нажатие на Enter приведет к появлению в буфере последовательности CRLF (0x0D0x0A, \r\n). Настройка SecureCRT "New line mode" (передача двух символов CRLF вместо одного символа CR): [Пример декодирования команд] Алгоритм обработки символов, которые вводит пользователь в терминале, на псевдокоде: // Переменная, определяющая декодированное действие:
u8 action = ACTION_NONE;
// Возможные значения для переменной action: ACTION_NONE // ничего не делать, ожидание команды ACTION_BACKSPACE // удаление символа слева от курсора ACTION_TAB // действие по клавише Tab (пока ничего не делать) ACTION_ENTER // обработка введенной команды ACTION_SHOW_HELP // показать подсказку по командной строке // Текущее состояние обработки приема:
u8 decodemode = SYM_SINGLE;
// Возможные значения для переменной decodemode: SYM_SINGLE // ожидание ввода пользователя по одному символу SYM_1B // начало Esc-последовательности Появился символ? Да: сброс счетчика таймаута Нет: продолжаем отсчет таймаута switch(decodemode)
{
SYM_SINGLE: Если появившийся символ O8, то action = ACTION_BACKSPACE Очистка буфера Если появившийся символ 09, то action = ACTION_TAB Очистка буфера Если появившийся символ 0D, то action = ACTION_ENTER Взять данные команды из буфера Очистка буфера Если появившийся символ ?, то action = ACTION_SHOW_HELP Очистка буфера Если появившийся символ 1B, то decodemode = SYM_1B break; SYM_1B: Если таймаут вышел, то чтение кодов из буфера (коды в таблице выше) По результату декодирования кодов присвоение значения для action Очистка буфера decodemode = SYM_SINGLE; break; } switch(action)
{
ACTION_NONE: break; ACTION_BACKSPACE: удалить последний символ из буфера приема передать CR для возврата курсора в начало строки передать то, что уже есть в буфере приема action = ACTION_NONE break; ACTION_TAB: action = ACTION_NONE break; ACTION_ENTER: передать CR для возврата курсора в начало строки передать LF для перехода на следующую строку декодировать данные буфера как команду выполнить команду action = ACTION_NONE break; ACTION_SHOW_HELP: передать CR для возврата курсора в начало строки передать LF для перехода на следующую строку вывести подсказку action = ACTION_NONE break; } [Ссылки] 1. Terminal codes (ANSI/VT100) introduction site:wiki.bash-hackers.org. |