Как подключиться к последовательному порту так же просто, как использовать SSH?

Есть ли способ подключиться к последовательному терминалу так же, как и с SSH? Должен быть более простой способ, чем инструменты, такие как Minicom, как это

$ serial /dev/ttyS0 

Я знаю, что могу вывести вывод из /dev/ttyS0 но возможно только одностороннее общение, от порта до консоли. И echo выход в порт такой же, но наоборот, в порт.

Как я могу реализовать двухстороннюю связь с последовательным портом самым простым способом в Unix / Linux?

12 Solutions collect form web for “Как подключиться к последовательному порту так же просто, как использовать SSH?”

Я нахожу screen самой полезной программой для последовательной связи, так как я использую ее для других вещей в любом случае. Обычно это только screen /dev/ttyS0 <speed> , хотя настройки по умолчанию могут отличаться для вашего устройства. Он также позволяет вам что-либо передавать в сеанс, введя командный режим и исполняющий exec !! <run some program that generates output> exec !! <run some program that generates output> .

Задний план

Основная причина, по которой вам нужна любая программа, например minicom для связи через последовательный порт, заключается в том, что порт должен быть настроен до начала соединения. Если он не был настроен соответствующим образом, команды cat и echo не будут делать для вас то, что вы ожидали. Обратите внимание, что после запуска программы, например minicom , порт остается с настройками minicom . Вы можете запросить параметры связи с помощью программы stty следующим образом:

 stty < /dev/ttyS0 

Если вы сделали это правильно; после загрузки компьютера и перед запуском любой другой программы, такой как minicom, параметры связи будут установлены по умолчанию. Возможно, они отличаются друг от друга тем, что вам нужно будет сделать. В этой ситуации отправка команд cat или echo в порт будет либо производить мусор, либо вообще не работать.

Запустите stty снова после использования minicom и вы заметите, что настройки установлены в зависимости от того, что использовала программа.

Минимальная последовательная связь

В основном, что необходимо сделать для двусторонней связи через последовательный порт, является: 1) настройка последовательного порта и 2) открытие псевдо-tty-чтения-записи.

Самая основная программа, которую я знаю, делает это picocom . Вы также можете использовать инструмент, например setserial для настройки порта, а затем взаимодействовать с ним непосредственно из оболочки.

Если UUCP установлен в системе, вы можете использовать команду cu , например

  $ cu -l /dev/ttyS0 -s 9600 

Я нашел способ, используя сценарий оболочки здесь, который помещает cat в качестве фонового процесса и цикл while, который считывает ввод пользователя и выводит его обратно в порт. Я изменил его, чтобы быть более общим, и он идеально подходил для моей цели.

 #!/bin/sh # connect.sh # Usage: # $ connect.sh <device> <port speed> # Example: connect.sh /dev/ttyS0 9600 # Set up device stty -F $1 $2 # Let cat read the device $1 in the background cat $1 & # Capture PID of background process so it is possible to terminate it when done bgPid=$! # Read commands from user, send them to device $1 while read cmd do echo "$cmd" done > $1 # Terminate background read process kill $bgPid 

Этот скрипт основан на другом ответе , но отправляет все через последовательный порт (кроме Ctrl + Q), а не только отдельные команды, за которыми следует Enter . Это позволяет использовать Ctrl + C или Ctrl + Z на удаленном хосте и использовать интерактивные программы «GUI», такие как aptitude или alsamixer. Его можно закрыть, нажав Ctrl + Q.

 #!/bin/bash if [[ $# -lt 1 ]]; then echo "Usage:" echo " femtocom <serial-port> [ <speed> [ <stty-options> ... ] ]" echo " Example: $0 /dev/ttyS0 9600" echo " Press Ctrl+Q to quit" fi # Exit when any command fails set -e # Save settings of current terminal to restore later original_settings="$(stty -g)" # Kill background process and restore terminal when this shell exits trap 'set +e; kill "$bgPid"; stty "$original_settings"' EXIT # Remove serial port from parameter list, so only stty settings remain port="$1"; shift # Set up serial port, append all remaining parameters from command line stty -F "$port" raw -echo "$@" # Set current terminal to pass through everything except Ctrl+Q # * "quit undef susp undef" will disable Ctrl+\ and Ctrl+Z handling # * "isig intr ^Q" will make Ctrl+Q send SIGINT to this script stty raw -echo isig intr ^Q quit undef susp undef # Let cat read the serial port to the screen in the background # Capture PID of background process so it is possible to terminate it cat "$port" & bgPid=$! # Redirect all keyboard input to serial port cat >"$port" 

BTW, пакет putty (который работает в Linux) включает в себя последовательную поддержку.

Putty хорошо работает в Linux и предлагает некоторое удобство, особенно для последовательной связи. У меня есть один недостаток, который я не смог решить напрямую: никакой копии-пасты из самого окна Putty. В версии Windows есть прекрасная автокопия в буфер обмена по выделенной области, щелкните правой кнопкой мыши, чтобы вставить поведение (и есть отличные плагины для Chrome и FireFox, чтобы включить такое же поведение), но в Linux нет копий любви AFAIK.

Если нехватка копии является проблемой (это для меня), тогда включите ведение журнала в шпатлевке и откройте стандартное окно терминала, а # tail -f putty.log и двунаправленный текст доступны для стандартного действия copypasta.

Как уже упоминалось, вы можете попробовать picocom. Последняя версия (2.0) также может быть использована (безопасно) для настройки «терминального сервера», поскольку она больше не позволяет вводить команду оболочки. Видеть:

https://github.com/npat-efault/picocom/releases

Это зависит от того, что вы хотите сделать. Вы хотите запустить оболочку или приложение в интерактивном режиме с терминала, подключиться к другому компьютеру по последовательной линии, автоматизировать связь с устройством через последовательный порт?

Если вы хотите двунаправленную связь, я предполагаю, что вы хотите что-то интерактивное с человеком на терминале. Вы можете настроить систему на разрешение входа в систему через терминал через последовательный порт, настроив сеанс getty (1) на последовательном порту – getty – это инструмент для настройки терминала и входа на него. Поместите запись в файл inittab (5), чтобы запустить его на соответствующем последовательном порту на основе respawn .

Если вы хотите подключиться к устройству и начать автоматические двусторонние разговоры, тогда вы можете увидеть, ожидают ли вы, что вы хотите. Используйте stty (1), чтобы настроить порт на правильную четность, скорость передачи и другие соответствующие настройки.

Если вы хотите взаимодействовать с другим компьютером через последовательный порт, вам понадобится программное обеспечение эмуляции терминала. Это довольно много – он устанавливает порт, интерпретирует ANSI или другие последовательности команд терминала (ANSI был далеко не единственным стандартом, поддерживаемым последовательными терминалами). Многие терминальные эмуляторы также поддерживают протоколы передачи файлов, такие как kermit или zmodem.

Входы и выходы последовательной связи и терминального ввода-вывода довольно сложны; вы можете прочитать больше, чем когда-либо хотели узнать по этому вопросу в серийном руководстве .

Вы можете взглянуть на

http://serialconsole.sourceforge.net

Pro: не имеет очевидных проблем безопасности, таких как minicom или picocom (если у вас нет проблемы с доступом к оболочке пользователей, никаких проблем, но у вас, скорее всего , есть один, если вы хотите настроить сервер терминалов … )

Попробуйте http://tio.github.io

«tio» – это простое приложение терминалов TTY, которое имеет простой интерфейс командной строки для простого подключения к устройствам TTY для базового ввода / вывода.

Типичное использование без параметров. Например:

 tio /dev/ttyS0 

Что соответствует часто используемым опциям:

 tio --baudrate 115200 --databits 8 --flow none --stopbits 1 --parity none /dev/ttyS0 

Он поставляется с полной поддержкой автоматического завершения оболочки для всех параметров.

Вы должны быть уверены, что у вас есть правильные разрешения на чтение на устройстве, вы можете увидеть это с помощью:

 $ls -l /dev/[serial device] 

Я полагаюсь на сценарий, который вы нашли, и внесла некоторые изменения.

Для систем разработки, которые я использовал к настоящему времени, они нуждались:

  • Отсутствие паритета и
  • Один стоповый бит

Эти значения являются значениями по умолчанию в скрипте.

Поэтому, чтобы подключиться, вы можете использовать его так просто:

 ./connect.sh /dev/[serial device] [baud speed] 

Пример:

 $./connect.sh /dev/ttyUSB0 19200 

Автор сценария:

 #!/bin/bash # connect.sh #Taken from example modified by: ihatetoregister # On stack exchange, thread: # http://unix.stackexchange.com/questions/22545/how-to-connect-to-a-serial-port-as-simple-as-using-ssh # Modified by Rafael Karosuo <rafaelkarosuo@gmail.com> # - parity enabling and amount of stop bits # - no execution without minimum params # - exit code for stty # - bgPid fix, used $! instead of $? to take the PID of cat proc in background. # - exit command to end the program # - CR termination and strip of NL added by READ command, in order to make $cmd\r\n format instead of \n$cmd\n # Usage: # $./connect.sh <device> <port speed> [# Stop bits] [parity] # Stop bits 1|2 # Parity even | odd # If no last two params, then default values stopbits=1, parity=disab # Example: # connect.sh /dev/ttyS0 9600 1 even, this will use 1 stop bit and even parity # connect.sh /dev/ttyS0 9600, this will take default values for parity and stopbit #Check if at least port and baud params provided if [ -z "$1" ] || [ -z "$2" ]; then printf "\nusage: ./connect.sh <device> <port speed> [# Stop bits 1|2] [parity even|odd]\n\tNeed to provide at least port and baud speed parameters.\n\texample:connect.sh /dev/ttyS0 9600\n\n" exit 1; else case "$3" in 2) stopb="cstopb";; *) stopb="-cstopb";; esac if [ "$4" = "even" ]; then par="-parodd" elif [ "$4" = "odd" ]; then par="parodd" else par="-parity" fi printf "\nThen stty -F $1 $2 $stopb $par\n"; fi # Set up device stty -F "$1" "$2" "$stopb" "$par" -icrnl # Check if error ocurred if [ "$?" -ne 0 ]; then printf "\n\nError ocurred, stty exited $?\n\n" exit 1; fi # Let cat read the device $1 in the background cat -v "$1" & # Capture PID of background process so it is possible to terminate it when done bgPid="$!" # Read commands from user, send them to device $1 while [ "$cmd" != "exit" ] do read cmd echo -e "\x08$cmd\x0D" > "$1" #strip off the \n that read puts and adds \r for windows like LF done # Terminate background read process kill "$bgPid" 

PS: Вам нужно знать, какой тип линии используется вашей приемной системой, так как это определит, как вам нужно будет отправлять команды в моем случае. Мне нужна Windows, например, LF, означает, что мне нужно отправить

 command\r 

Значения ASCII для:

  • LF: 0Ah, строка "\ n"
  • CR: 0Dh, возврат каретки «\ r»
  • BS: 08h, обратное пространство "<-"
  • Доступ к консоли Ubuntu 16.04 KVM Гость
  • Почему виртуальный терминал Linux поддерживает только 16 цветов по умолчанию?
  • GNU Экранные странные символы при нажатии
  • Блокировать эхо-сигнал TTY для отображения
  • Подключите два устройства ttySx на одном компьютере
  • Как я могу заставить консоль выводить что-то другое, чем фреймбуфер?
  • Получить отображаемый номер для данного tty
  • Почему showconsolefont имеет разные выходные данные в tmux?
  • экрана по сравнению с открытием виртуальных консолей
  • Определить владельца сеанса процесса
  • Каждый пользователь получает свои собственные tty (ы)?
  • Терминалы «Unbusy», которые будут выведены из системы, когда TMOUT достигнут
  • Linux и Unix - лучшая ОС в мире.