Захват ответа управляющей последовательности ANSI с помощью LUA

Я использую ESP8266 с Nodemcu для связи с последовательным терминалом с помощью Putty. Использование escape-последовательностей, как указано в этих вопросах:

Чтение побега ANSI с терминала

Как определить размер терминала ANSI?

Список escape-последовательностей https://vt100.net/docs/vt100-ug/chapter3.html

Я пытаюсь прочитать escape-последовательность, которая является ответом на поиск позиции курсора с помощью LUA. Кажется, я не получаю видимого ответа (ожидаемого), но я также ничего не получаю. Все работает, кроме ответа.

Что я делаю не так, как я могу получить ответ?

  -- Clear screen
  uart.write(0, "\033[2J")

  -- Setup event handler callback to read data from terminal
  -- Control sequence is terminated with an 'R'
  -- I'm replacing ESC in the reply so that I can hopefully get a visible reply like _[25;80R

  uart.on("data", 0, function(data)
    if data ~= 'R' then
      uart.write(0, data)
    end
    if data == '\033' then
      uart.write(0, "_")
    end
  end, 0)

  -- ESC = \033
  
  -- cursorpos(v,h) CUP    Move cursor to screen location v,h     ^[[<v>;<h>H
  uart.write(0, "\033[20;20H")
  
  uart.write(0, "\033[6n")

  -- Response:
  -- cursorpos CPR         Response: cursor is at v,h          ^[<v>;<h>R

person Biyau    schedule 13.03.2021    source источник
comment
nodemcu.readthedocs.io/en/release/modules/uart   -  person Biyau    schedule 13.03.2021


Ответы (1)


Похоже, у меня была синтаксическая ошибка с обработчиком чтения uart. Я изменил /033 для ESC на CTRL-v[ и условие для моего оператора IF. Я не уверен, почему \033 не работает.

Для тестирования я также изменил часть 20;20 на 200;200, просто чтобы посмотреть, как это работает, и дал правильный ожидаемый ответ: _[45;157R

Я изменил код с:

  uart.on("data", 0, function(data)
    if data ~= 'R' then
      uart.write(0, data)
    end
    if data == '\033' then
      uart.write(0, "_")
    end
  end, 0)

To:

 uart.on("data", 0, function(data)
 if data == '\27' then 
   uart.write(0,"_")
 else
   uart.write(0, data) end end, 0)
person Biyau    schedule 13.03.2021
comment
В Lua вы должны писать "\27[6n" вместо "\033[6n" - person Egor Skriptunoff; 13.03.2021