Як підключитися до послідовного порту так само просто, як за допомогою 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
Lekensteyn

screenце дивовижно, але я не думаю, що це простіше, ніж minicom:-)
Ciro Santilli 新疆 改造 中心 法轮功 六四

1
@CiroSantilli 刘晓波 死 六四 事件 法轮功 - Екран може бути не простішим, ніж Minicom, але оскільки я вже використовую Screen, для мене менше складності робити свої серійні речі із Screen, що повністю виключає потребу в Minicom.
yeti

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 колись просто не надсилатиме та не отримуватиме дані на порт, який працював за моменти до того, або пікоком не має проблем. Це, мабуть, певний параметр конфігурації, але що б там не було, я не можу цього зрозуміти (і така поведінка траплялася на декількох машинах).
Майкл Берр

+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/…
Fritz

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

До речі, пакет шпаклівки (який працює на Linux) містить серійну підтримку.


4

Інша проблема, яка може виникнути, полягає в тому, що для доступу до послідовного порту для вашого облікового запису користувача, можливо, потрібно буде встановити групу "діалот".

sudo usermod -a -G dialout $USER

3

Putty добре працює в Linux і пропонує деяку зручність, особливо для послідовного зв'язку. У нього є один недолік, який я не зміг вирішити безпосередньо: жодної копії-пасти з самого вікна Putty. У версії Windows є прекрасна автоматична копія до буфера обміну, клацніть правою кнопкою миші, щоб вставити поведінку (і є чудові плагіни як для хрому, так і для firefox, щоб дозволити однакову поведінку), але в Linux, жодна копія не любить AFAIK.

Якщо відсутність копії є проблемою (це для мене), тоді увімкніть вхід у шпаклівку та відкрийте стандартне вікно терміналу, а # tail -f putty.logдля стандартних дій copypasta доступний двонаправлений текст.


1
Я вважаю, що Putty під Linux не вставляє "буфер обміну" (те, що ви копіюєте з control-C), але він вставить "первинний вибір" (те, що ви вибрали в якійсь програмі) середньою мишкою. Так само ви можете вибрати символи на екрані Putty, щоб визначити основний вибір. Але якщо я хочу, щоб текст із екрана Putty перейшов до якоїсь віртуальної машини, мені потрібно, щоб це був буфер обміну, тому мені потрібно використовувати посередницьку програму, щоб отримати текст від основного вибору, а потім скопіювати його в буфер обміну.
Кардіфф космічна людина

3

Як було сказано раніше, ви можете спробувати пікоком. Остання версія (2.0) також може бути використана (безпечно) для налаштування "термінального сервера", оскільки він більше не дозволяє вводити команду оболонки. Побачити:

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


2

Це залежить від того, що ви хочете зробити. Ви хочете інтерактивно запускати оболонку або програму з терміналу, підключатися до іншого комп'ютера через послідовну лінію, автоматизувати зв’язок із пристроєм через послідовний порт?

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

Якщо ви хочете підключитися до пристрою та розпочати автоматизовані двосторонні розмови, то ви можете побачити, чи очікуєте , що ви отримаєте те, що хочете. Використовуйте stty (1) для налаштування порту на правильний паритет, швидкість передачі даних та інші відповідні налаштування.

Якщо ви хочете інтерактивно спілкуватися з іншим комп'ютером через послідовний порт, тоді вам знадобиться програмне забезпечення для емуляції терміналів. Це робить дуже багато - він налаштовує порт, інтерпретує ANSI або інші командні послідовності команд (ANSI був далеко не єдиним стандартом, що підтримується послідовними терміналами). Багато емуляторів терміналів також підтримують протоколи передачі файлів, такі як kermit або zmodem.

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


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, повернення carrige "\ r"
  • BS: 08h, зворотній простір "<-"

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


1

Цікаво, чому сер2нет ніхто не згадав .

Приклад /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:

-X

Вмикає переадресацію 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.