Настройки строки терминала 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 процесс.

Другие вопросы по тегам