it-swarm-eu.dev

Jak se připojit k sériovému portu tak snadno jako pomocí SSH?

Existuje způsob, jak se připojit k sériovému terminálu stejně jako u SSH? Musí existovat jednodušší způsob než takové nástroje, jako je Minicom

$ serial /dev/ttyS0 

Vím, že mohu cat výstup z /dev/ttyS0 ale tímto způsobem je možná pouze jednosměrná komunikace, od portu po konzolu. A echo ven na port je stejný, ale naopak, na port.

Jak mohu realizovat obousměrnou komunikaci se sériovým portem nejjednodušším možným způsobem na Unixu/Linuxu?

95
ihatetoregister

Našel jsem screen nejužitečnější program pro sériovou komunikaci, protože jej používám i pro jiné věci. Je to obvykle jen screen /dev/ttyS0 <speed>, i když výchozí nastavení se může pro vaše zařízení lišit. Také vám umožňuje vložit cokoli do relace zadáním příkazového režimu a provedením exec !! <run some program that generates output>.

76
Shawn J. Goff

Pozadí

Hlavním důvodem, proč potřebujete libovolný program jako minicom pro komunikaci přes sériový port je to, že port musí být nastaven před navázání spojení. Pokud by to nebylo nastaveno správně, příkazy cat a echo by pro vás neudělaly to, co jste očekávali. Všimněte si, že jakmile spustíte program jako minicom, port zůstane s nastavením, které minicom použil. Nastavení komunikace můžete dotazovat pomocí programu stty takto:

stty < /dev/ttyS0

Pokud jste to udělali správně; po zavedení počítače a před spuštěním jakéhokoli jiného programu, například minicom, nastavení komunikace bude ve výchozím nastavení. Pravděpodobně se liší od toho, co budete potřebovat k vytvoření vašeho připojení. V této situaci odeslání příkazů cat nebo echo na port buď vytvoří odpadky, nebo nebude fungovat vůbec.

Spusťte stty znovu po pomocí minicom a zjistíte, že nastavení je nastaveno na to, co program používal.

Minimální sériová komunikace

K obousměrné komunikaci prostřednictvím sériového portu jsou v zásadě zapotřebí dvě věci: 1) konfigurace sériového portu a 2) otevření pseudottyčového čtení a zápisu.

Nejzákladnější program, o kterém vím, že to je picocom. Můžete také použít nástroj jako setserial k nastavení portu a pak s ním komunikovat přímo z prostředí Shell.

50
rozcietrzewiacz

Pokud je v systému nainstalován UUCP, můžete použít příkaz c, např.

 $ cu -l /dev/ttyS0 -s 9600
26
ktf

Našel jsem způsob, jak používat skript Shell zde , který dal cat jako proces na pozadí a smyčku while, která přečetla vstup uživatele a echo to na port. Upravil jsem to tak, aby byl obecnější a dokonale vyhovoval mému účelu.

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

Zkuste http://tio.github.io

"tio" je jednoduchá TTY koncová aplikace, která obsahuje přímé rozhraní příkazového řádku pro snadné připojení k zařízením TTY pro základní vstup/výstup.

Typické použití je bez doplňků. Například:

tio /dev/ttyS0

Což odpovídá běžně používaným možnostem:

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

Je dodáván s plnou podporou automatického doplňování Shell pro všechny možnosti.

15
Martin

Tento skript je založen na další odpověď , ale odešle vše přes sériový port (kromě Ctrl+Q), nikoli pouze jednotlivé příkazy následované Enter. To vám umožní používat Ctrl+C nebo Ctrl+Z na vzdáleném hostiteli a používat interaktivní programy „GUI“, jako je aptitude nebo alsamixer. Můžete ji ukončit stisknutím 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 "[email protected]"

# 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"
14
Fritz

BTW, balíček PuTTY (který běží na Linuxu) neobsahuje sériovou podporu.

7
mdpc

Dalším problémem, který může nastat, je, že váš uživatelský účet bude možná muset nastavit skupinu „dialout“ pro přístup k sériovému portu.

Sudo usermod -a -G dialout $USER
5
dfowler7437

PuTTY funguje dobře na Linuxu a nabízí určité pohodlí, zejména pro sériovou komunikaci. Má jednu nevýhodu, kterou jsem nebyl schopen přímo vyřešit: žádná kopie-vložit ze samotného okna PuTTY. Verze systému Windows má krásnou automatickou kopii do schránky na zvýraznění, kliknutím pravým tlačítkem myši vložíte chování (a existují vynikající pluginy pro oba chrome a firefox umožňující stejné chování)), ale v systému Linux , žádná kopie láska AFAIK.

Pokud je problém s nedostatkem kopie (je to pro mě), zapněte protokolování v PuTTY a otevřete standardní okno terminálu a # tail -f PuTTY.log a obousměrný text je k dispozici pro standardní akci copypasta.

3
gessel

Jak již bylo zmíněno, můžete vyzkoušet picocom. Nejnovější verzi (2.0) lze také použít (bezpečně) k nastavení „terminálového serveru“, protože již nepovoluje vstřikování příkazů Shell. Vidět:

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

3
Nick Patavalis

Záleží na tom, co chcete dělat. Chcete interaktivně spouštět Shell nebo aplikaci z terminálu, připojit se k jinému počítači přes sériovou linku, automatizovat komunikaci se zařízením přes sériový port?

Pokud chcete obousměrnou komunikaci, pak předpokládám, že chcete na terminálu něco interaktivního s člověkem. Můžete nakonfigurovat systém tak, aby umožňoval přihlášení z terminálu přes sériový port nastavením getty (1) relace na sériovém portu - getty je nástroj pro nastavení terminálu a umožnění přihlášení na něj . Vložte soubor do svého inittab (5) souboru a spusťte jej na příslušném sériovém portu na základě respawn.

Pokud se chcete připojit k zařízení a zahájit automatizované obousměrné konverzace, můžete vidět, zda očekávat dostanete, co chcete. Pomocí stty (1) nakonfigurujte port na správnou paritu, přenosovou rychlost a další relevantní nastavení.

Pokud chcete komunikovat interaktivně s jiným počítačem přes sériový port, budete potřebovat software emulace terminálu. Dělá to docela hodně - nastavuje port, interpretuje ANSI nebo jiné příkazové sekvence terminálu (ANSI nebyl zdaleka jediným standardem podporovaným sériovými terminály). Mnoho emulátorů terminálů také podporuje protokoly pro přenos souborů, jako je Kermit nebo zmodem.

Vstupy a výstupy sériové komunikace a terminálových I/O jsou poměrně složité; můžete si přečíst více, než jste kdy chtěli vědět o předmětu v serial howto.

Zajímalo by mě, proč nikdo nezmínil ser2net .

Příklad /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

K sériovému portu se můžete připojit stejně snadno jako:

telnet localhost 3000

Nebo vzdáleně:

telnet <ip> 3000

Nebo dokonce nastavte přeposílání portů na routeru a vystavte jej internetu, abyste se k němu mohli připojit odkudkoli (pojďme přeskočit bezpečnostní otázky, mluvím o flexibilitě).

2

Protože to zde již není uvedeno, zmíním se také o socat - více informací v https://stackoverflow.com/questions/2899180/how-can-i-use-com-and -usb-ports-inside-cygwin :

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

nebo

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

(Přesto jsem měl problém zastavit jej, jakmile se spustí, pod MSYS2 na Windows)

2
sdbbs

Musíte mít jistotu, že máte na zařízení správná povolení ke čtení, mohli byste to vidět pomocí:

$ls -l /dev/[serial device]

Spoléhám na skript, který jste našli a provedli nějaké úpravy.

Pro vývojové systémy, které jsem použil, potřebovali:

  • Žádná parita a
  • Jeden stop bit

Tyto hodnoty jsou ve skriptu výchozí.

Chcete-li se připojit, můžete jej použít tak jednoduše, jak je uvedeno níže:

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

Příklad:

$./connect.sh /dev/ttyUSB0 19200

Skript:

#!/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 <[email protected]>
#   - 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: Musíte vědět, jaký druh řádkového zdroje používá váš přijímací systém, protože to určí, jak budete muset posílat příkazy v mém případě, že jsem potřeboval Windows jako LF, což znamená, že potřebuji poslat

command\r

Hodnoty ASCII pro:

  • LF: 0Ah, řádkový posuv "\ n"
  • CR: 0Dh, carrige návrat "
  • BS: 08h, zadní prostor "<-"
1
Rafael Karosuo

Možná se budete chtít podívat na

http://serialconsole.sourceforge.net

Pro: nemá zjevné bezpečnostní problémy jako minicom nebo picocom (pokud nemáte problém dávat uživatelům Shell přístup, žádný problém, ale pravděpodobně do jeden, pokud chcete nastavit terminálový server ...)

1
Peter

Další snadnou možností je přístup ke stroji přes ssh pomocí -X označte a spusťte program, jako je PuTTY nebo gtkterm.

Tak:

$ ssh -X <user>@<machine_address>

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

$ gtkterm

To by mělo spustit grafické rozhraní na vašem klientském počítači a odtud můžete přistupovat na sériový port, jako byste byli v hostiteli.

Zřeknutí se odpovědnosti: Tuto akci jsme vyzkoušeli pouze u počítačů ubuntu. Hádám, že to nebude fungovat se stroji bez grafického rozhraní.

Z manuálu ssh:

-X

Umožňuje předávání X11. To lze také zadat v konfiguračním souboru na hostitele. Předávání X11 by mělo být povoleno s opatrností. Uživatelé s možností obejít oprávnění souboru na vzdáleném hostiteli (pro uživatelskou autorizační databázi X) mají přístup k místnímu displeji X11 prostřednictvím přesměrovaného připojení. Útočník pak může být schopen provádět činnosti, jako je sledování stisknutí kláves. Z tohoto důvodu je předávání X11 ve výchozím nastavení předmětem rozšíření X11 SECURITY. Další informace viz možnost ssh -Y a směrnice ForwardX11Trusted v ssh_config (5).

-Y

Umožňuje důvěryhodné předávání X11. Důvěryhodné předávání X11 nepodléhá ovládacím prvkům rozšíření X11 SECURITY.

Takže použijte -Y pokud je problémem zabezpečení.

0
Grifo