Настройки строки терминала GNU Screen
Я хочу использовать экран GNU для мониторинга через последовательный порт USB следующим образом:
$ screen /dev/ttyUSB0 115200
Но мне нужно немного подправить настройки терминала. Я сделал несколько попыток, но ни одна из них не сработала. Например, чтобы послать NL+CR для символа новой строки, а не только для NL, настройкой строки терминала является onlcr.
Попытка 1 - без каких-либо специальных настроек:
$ screen /dev/ttyUSB0 115200
# only sends NL
Попытка 2 - через экран:
$ screen /dev/ttyUSB0 115200,onlcr
# still only sends NL
Попытка 3 - через ssty:
$ stty -F /dev/ttyUSB0 onlcr
$ screen /dev/ttyUSB0 115200
# still only sends NL
Попытка 4 - через оба:
$ stty -F /dev/ttyUSB0 onlcr
$ screen /dev/ttyUSB0 115200,onlcr
# still only sends NL
Попытка 5 - в другом порядке:
$ screen /dev/ttyUSB0 115200,onlcr
# then ctrl+a, ctrl+z to pause the screen session
$ stty -F /dev/ttyUSB0 onlcr
stty: /dev/ttyUSB0: Device or resource busy
Во всех случаях, если я запускаю stty для проверки настроек линии терминала, я получаю это:
Перед запуском экрана - обратите внимание на наличие -onlcr:
$ stty -F /dev/ttyUSB0
speed 115200 baud; line = 0;
kill = ^H; min = 100; time = 2;
-icrnl -imaxbel
-opost -onlcr
-isig -icanon -echo
Изменение настройки stty - обратите внимание, что -onlcr исчез:
$ stty -F /dev/ttyUSB0 onlcr
$ stty -F /dev/ttyUSB0
speed 115200 baud; line = 0;
kill = ^H; min = 100; time = 2;
-icrnl -imaxbel
-opost
-isig -icanon -echo
После запуска экрана - обратите внимание, что -onlcr снова вернулся:
$ stty -F /dev/ttyUSB0
speed 115200 baud; line = 0;
kill = ^H; min = 100; time = 2;
-icrnl -imaxbel
-opost -onlcr
-isig -icanon -echo
Это как если бы экран игнорировал все настройки stty и сбрасывал их на свои значения по умолчанию. И это то же самое на обеих машинах, на которых я тестировал; Debain 8.7 и macOS Sierra 10.12.4
Я видел сообщения с другими людьми, сталкивающимися с подобными проблемами, но ни один не дает однозначного ответа. Многие люди заканчивают тем, что рекомендуют альтернативу экрану, как Minicom, но теперь я заинтересован.
Можно ли использовать с экраном настройки stty, например onlcr?
3 ответа
Я просто прошел через тот же процесс, только чтобы выяснить, как экран заглушает все настройки. Один комментарий здесь предлагает изменить исходный код экрана: Как включить CR/LF на экране GNU?
В конце концов, я был очень рад найти более минимальную программу, которая позволяет передавать аргументы в стиле stty из командной строки: https://github.com/npat-efault/picocom
Он также красиво печатает настройки последовательного порта при запуске, чтобы вы могли легко проверить их.
Пакеты существуют в дистрибутивах Debian (sudo apt-get install picocom
), а для других кажется, что компиляция проста. Одна зависимость - это библиотека белья, которую можно отключить.
Другая вещь, которую вы можете сделать, если у вас открыто два окна терминала, - это низкоуровневый резервный взлом, когда ничего не работает: в одном типе терминала cat /dev/ttyUSB0
, Затем в другом настройте параметры терминала, которые вы хотите с sudo stty
, Затем с этого же терминала вы можете отправлять команды через echo "Some text" > /dev/ttyUSB0
, Вы можете перевести вывод команды cat, пропустив ее через sed
или же tr
, Например cat /dev/ttyUSB0 | tr '\r' '\n'
переведет все полученные возвраты каретки в перевод строки.
То, как я справился с этим, чтобы начать screen
работает без каких-либо специальных параметров терминала, используя в вашем случае: screen /dev/ttyUSB0 115200
и затем оставьте его работающим, переключитесь на другое окно терминала и выполните stty
команды оттуда.
Если вы остановитесь screen
Я думаю, что это как-то блокирует устройство (или его, потому что вы не используете sudo
). Оказавшись в другом окне, вы можете ввести sudo stty -F /dev/ttyUSB0 onlcr
и это изменит поведение screen
сессия с тех пор. Проблема в том, что screen
игнорирует переданную ему настройку и просто настраивает tty по-своему. Вы можете напечатать sudo stty -F /dev/ttyUSB0 -a
вывести список настроек из другого окна во время работы экрана, а затем изменить их при необходимости. (Обратите внимание, что на Mac -F
должен быть в нижнем регистре.)
Если у вас есть только одно окно терминала, то это проблематично, потому что установка screen
в фоновом режиме и оставляя его работающим, просто смешивает потоки ввода и вывода между оболочкой и screen
процесс.