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


86

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

$ serial /dev/ttyS0 

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

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


2
Великолепные ответы людей! К сожалению, никто, кажется, не полностью соответствует моим целям при работе со встроенными системами с ограниченным набором команд. Однако я нашел другой способ, используя сценарий оболочки, который я добавил в качестве одного из ответов на мой вопрос.
ihatetoregister

Ответы:


69

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


3
+1 за экран! Также см .: serverfault.com/q/81544/11086
Джош

1
Смотрите также noah.org/wiki/Screen_notes#using_screen_as_a_serial_terminal и страницу руководства stty (1), мне пришлось добавить дополнительные опции (например, четность), чтобы это работало.
Лекенстейн

3
стыдно, что я неправильно соединил TX / RX: o
Лекенштейн

screenэто круто, но я не думаю, что это проще, чем minicom:-)
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

1
@CiroSantilli Screen 死 六四 事件 法轮功 - Экран может быть не проще, чем Minicom, но, поскольку я уже использую Screen, для меня гораздо проще выполнять сериалы с Screen, что полностью исключает необходимость в Minicom.
йети

48

Фон

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

stty < /dev/ttyS0

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

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

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

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

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


5
picocomтакже позволит вам подключиться к последовательному порту, не переконфигурируя его ( --noinit), и позволит вам выйти без восстановления конфигурации последовательного порта ( --noresetили использовать Ctrl-A/ Ctrl-Qдля выхода picocom). Я обнаружил, picocomчто намного проще в использовании, чем minicom. По причинам, которые я не выяснил, иногда Minicom просто не будет отправлять или получать данные через порт, который работал несколько минут назад или с которым у Picocom нет проблем. Вероятно, это какой-то непонятный вариант конфигурации, но что бы это ни было, я не могу понять это (и такое поведение имело место на более чем одной машине).
Майкл Берр

+1 за пиком! Я обнаружил, что не могу писать команды на последовательное устройство без правильных окончаний строк: мне нужно было использовать --omap crcrlf --echoопции
user2561747

24

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

 $ cu -l /dev/ttyS0 -s 9600

Используйте ~^Dили ~.для выхода.
Иман

24

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

#!/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

1
Кроме того, я сделал немного измененную версию ниже, которая также может отправлять Ctrl + C и Ctrl + Z.
Фриц

@Fritz Хорошая находка! Так что, если я правильно понял, фоновый процесс никогда не будет убит, потому что $? кажется, не расширяется ни к чему, верно?
ihatetoregister

1
@ihatetoregister: Не совсем правильно. Фоновый процесс убит, но не по причинам, которые можно было бы ожидать. $?расширяется до кода завершения последней не фоновой команды (в данном случае stty -F $1 $2), поэтому она расширяется до 0, когда ошибки не было. Таким образом, становится последняя строка, kill 0которая, в свою очередь, похоже, убивает текущую оболочку и всех ее дочерних элементов (в интерактивных оболочках, я считаю, она ведет себя по-разному). Все подробности см. В следующем объяснении: unix.stackexchange.com/questions/67532/…
Фриц,

1
Однако настоящая ошибка в вашем сценарии заключается в том, что фоновый процесс прерывается только в том случае, если вы нажимаете Ctrl + D, чтобы завершить сценарий, потому что это завершает whileцикл без ошибок. Если вы убьете его с помощью Ctrl + C или с помощью killкоманды, то catпроцесс останется живым. Чтобы это исправить, вам нужно будет использовать trapкоманду для выполнения kill $bgPidпри выходе из оболочки, как это делает мой скрипт ниже . Честно говоря, я бы даже не возражал, если бы вы просто добавили весь мой сценарий в свой пост. Я пытался сделать это, но редактирование было отклонено.
Фриц

Не могли бы вы уточнить, где происходит соединение, поскольку это закомментировано в вашем ответе
Крис Хэлкроу,

14

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

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

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

tio /dev/ttyS0

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

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

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


3
Я использую msys2на Windows, и вы можете установить tioс, pacman -S tioпотому что он входит в число доступных пакетов по умолчанию. screen, picocomИ т.д. , не являются. Спасибо!
Коханьи Роберт

12

Этот сценарий основан на другом ответе , но отправляет все через последовательный порт (кроме 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"

7

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


4

Другая проблема, которая может возникнуть, заключается в том, что вашей учетной записи пользователя может потребоваться установить группу «dialout» для доступа к последовательному порту.

sudo usermod -a -G dialout $USER

3

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

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


1
Я обнаружил, что Putty в Linux не вставляет «буфер обмена» (то, что вы копируете с помощью control-C), но вставляет «основной выбор» (то, что вы в данный момент выбрали в какой-либо программе) средней мышью. Точно так же вы можете выбрать символы на экране Putty, чтобы определить основной выбор. Но если я хочу, чтобы текст с экрана Putty переносился на какую-то виртуальную машину, мне нужно, чтобы он был буфером обмена, поэтому я должен использовать программу-посредник, чтобы получить текст из основного выделения и затем скопировать его в буфер обмена.
Космический человек из

3

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

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


2

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

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

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

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

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


1

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

http://serialconsole.sourceforge.net

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


1

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

$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, пробел "<-"

1
(1)  #!/bin/shигнорируется, если это не первая строка файла. (2) Серьезно? Вы используете , 1чтобы указать даже паритет и 2указать нечетное ? (3) Обычно имеется сообщение «использование» или «помощь», которое документирует все параметры, а не только обязательные. (4) Вы должны всегда цитирую ваши ссылки на переменные оболочки (например, "$1", "$2", "$3", "$4", "$stopb", "$par", "$bgPid", и даже "$?"и "$!") , если у вас есть веские причины не делать этого , и вы будете уверены , что вы знаете , что вы делаете.
Скотт

1

Поскольку это уже не упомянуто здесь, я бы также упомянул socat- больше информации в https://stackoverflow.com/questions/2899180/how-can-i-use-com-and-usb-ports-within-cygwin :

socat `tty`,raw,echo=0 /dev/ttyS15,raw,echo=0,setsid,sane

или же

socat - /dev/ttyS15,raw,echo=0,setsid,sane

(хотя у меня была проблема с остановкой, когда он запускается, под MSYS2 на Windows)


1

Интересно, почему никто не упомянул ser2net .

Пример /etc/ser2net.conf:

3000:telnet:600:/dev/ttyUSB0:115200 8DATABITS NONE 1STOPBIT
3001:telnet:600:/dev/ttyUSB1:115200 8DATABITS NONE 1STOPBIT
3002:telnet:600:/dev/ttyUSB2:115200 8DATABITS NONE 1STOPBIT
3003:telnet:600:/dev/ttyUSB3:115200 8DATABITS NONE 1STOPBIT

Вы можете подключиться к последовательному порту так же просто, как:

telnet localhost 3000

Или удаленно:

telnet <ip> 3000

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


0

Другой простой способ - получить доступ к машине через ssh с -Xфлагом и запустить программу, такую ​​как putty или gtkterm.

Так:

$ ssh -X <user>@<machine_address>

$ sudo apt-get install gtkterm (if not installed already)

$ gtkterm

Он должен запустить графический интерфейс на вашем клиентском компьютере, и оттуда вы можете получить доступ к последовательному порту, как если бы вы были на хосте.

Отказ от ответственности: только попробовал это с машинами Ubuntu. Я предполагаю, что это не будет работать с машинами без графических интерфейсов.

Из руководства ssh:

-ИКС

Включает пересылку X11. Это также может быть указано для каждого хоста в файле конфигурации. Пересылка X11 должна быть включена с осторожностью. Пользователи с возможностью обхода прав доступа к файлам на удаленном хосте (для базы данных авторизации X пользователя) могут получить доступ к локальному дисплею X11 через переадресованное соединение. Затем злоумышленник сможет выполнять такие действия, как мониторинг нажатия клавиш. По этой причине на пересылку X11 по умолчанию распространяются ограничения расширения X11 SECURITY. Пожалуйста, обратитесь к опции ssh -Y и директиве ForwardX11Trusted в ssh_config (5) для получения дополнительной информации.

-Y

Включает доверенную пересылку X11. Доверенные пересылки X11 не подвергаются элементам управления расширением X11 SECURITY.

Так что используйте, -Yесли безопасность является проблемой.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.