Como se conectar a uma porta serial tão simples quanto usar o SSH?

73

Existe uma maneira de se conectar a um terminal serial da mesma forma que você faria com o SSH? Deve haver uma maneira mais simples que ferramentas como o Minicom, como este

$ serial /dev/ttyS0 

Eu sei que posso cat a saída de /dev/ttyS0 , mas somente uma forma de comunicação é possível dessa maneira, da porta para o console. E echo para a porta é a mesma, mas o contrário, para o porto.

Como posso realizar uma comunicação bidirecional com uma porta serial da maneira mais simples possível no Unix / Linux?

    
por ihatetoregister 13.10.2011 / 11:38

13 respostas

58

Eu acho o screen o programa mais útil para a comunicação serial, já que eu o uso para outras coisas. Geralmente, é apenas screen /dev/ttyS0 <speed> , embora as configurações padrão possam ser diferentes para o seu dispositivo. Ele também permite canalizar qualquer coisa para a sessão digitando o modo de comando e fazendo exec !! <run some program that generates output> .

    
por 13.10.2011 / 15:06
43

Antecedentes

A principal razão pela qual você precisa de qualquer programa como minicom para se comunicar através de uma porta serial é que a porta precisa ser configurada antes de iniciar uma conexão. Se não foram configurados corretamente, os comandos cat e echo não servirão para você o que você poderia esperar. Observe que, quando você executar um programa como minicom , a porta ficará com as configurações que minicom usou. Você pode consultar as configurações de comunicação usando o programa stty da seguinte forma:

stty < /dev/ttyS0

Se você fez certo; depois de inicializar o computador e antes de executar qualquer outro programa como minicom, , as configurações de comunicação terão suas configurações padrão. Estes são provavelmente diferentes do que você precisa para fazer sua conexão. Nessa situação, enviar os comandos cat ou echo para a porta produzirá lixo ou não funcionará.

Execute stty novamente após usando minicom e você perceberá que as configurações estão definidas para o que o programa estava usando.

Comunicação serial mínima

Basicamente, duas coisas são necessárias para ter uma comunicação bidirecional através de uma porta serial: 1) configurando a porta serial, e 2) abrindo a pseudo-tty leitura-escrita.

O programa mais básico que conheço é picocom . Você também pode usar uma ferramenta como setserial para configurar a porta e interagir com ela diretamente do shell.

    
por 13.10.2011 / 13:21
21

Eu encontrei uma maneira de usar um script de shell aqui que colocou cat como plano de fundo processo e um loop while que lê a entrada do usuário e echo out para a porta. Eu o modifiquei para ser mais geral e isso se ajustou perfeitamente ao meu propósito.

#!/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
    
por 18.10.2011 / 12:39
19

Se o UUCP estiver instalado no sistema, você pode usar o comando cu , por exemplo

 $ cu -l /dev/ttyS0 -s 9600
    
por 13.10.2011 / 12:39
9

Este script é baseado em outra resposta , mas envia tudo sobre o número de série porta (exceto Ctrl + Q), não apenas comandos únicos seguidos de Enter . Isso permite usar Ctrl + C ou Ctrl + Z no host remoto e usar programas "GUI" interativos como aptitude ou alsamixer. Pode ser encerrado pressionando 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"
    
por 22.09.2016 / 19:03
8

Tente o link

"tio" é um aplicativo de terminal TTY simples que possui uma interface de linha de comando simples para se conectar facilmente a dispositivos TTY para entrada / saída básica.

O uso típico é sem opções. Por exemplo:

tio /dev/ttyS0

O que corresponde às opções mais usadas:

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

Ele vem com suporte para preenchimento automático de shell completo para todas as opções.

    
por 02.09.2017 / 13:13
5

BTW, o pacote putty (que roda no Linux) inclui suporte serial.

    
por 14.10.2011 / 20:34
2

Depende do que você quer fazer. Você quer rodar um shell ou aplicativo interativamente a partir do terminal, conectar-se a outro computador através da linha serial, automatizar a comunicação com um dispositivo através de uma porta serial?

Se você quiser uma comunicação bidirecional, presumo que queira algo interativo com um humano no terminal. Você pode configurar o sistema para permitir logins de um terminal através de uma porta serial, configurando um getty (1) sessão na porta serial - getty é a ferramenta para configurar um terminal e permitir logins nele. Coloque uma entrada em seu arquivo inittab (5) para executá-lo na porta serial apropriada em uma base respawn .

Se você deseja se conectar a um dispositivo e iniciar conversas bidirecionais automatizadas, poderá ver se espera vai te dar o que você quer. Use stty (1) para configurar a porta para a paridade direita, taxa de transmissão e outras configurações relevantes.

Se você quiser se comunicar interativamente com outro computador pela porta serial, precisará de um software de emulação de terminal. Isso faz bastante - configura a porta, interpreta ANSI ou outras sequências de comando de terminal (o ANSI estava longe de ser o único padrão suportado por terminais seriais). Muitos emuladores de terminal também suportam protocolos de transferência de arquivos como o kermit ou o zmodem.

Os detalhes das comunicações seriais e I / O de terminal são bastante complexos; você pode ler mais do que jamais quis saber sobre o assunto no serial howto.

    
por 14.10.2011 / 13:36
2

O Putty funciona bem no Linux e oferece alguma conveniência, especialmente para comunicações em série. Tem uma desvantagem que não consegui resolver diretamente: não copie-cole da própria janela do Putty. A versão do Windows tem uma bela auto-cópia para a área de transferência, clique com o botão direito para colar o comportamento (e existem excelentes plugins para o Chrome e Firefox para permitir o mesmo comportamento), mas no Linux, nenhuma cópia amor AFAIK. >

Se a falta de cópia for um problema (é para mim), então ligue o registro em massa e abra uma janela de terminal padrão e # tail -f putty.log e texto bidirecional estão disponíveis para a ação copypasta padrão.

    
por 22.03.2015 / 19:30
2

Como mencionado antes, você pode tentar o picocom. A versão mais recente (2.0) também pode ser usada (com segurança) para configurar um "servidor de terminal", uma vez que não permite mais a injeção do comando shell. Veja:

link

    
por 28.08.2015 / 10:06
1

Você pode querer dar uma olhada em

link

Pro: não tem problemas de segurança óbvios como minicom ou picocom (se você não tiver problemas para conceder aos usuários acesso ao shell, não há problema, mas é mais provável que você faça tenha um, se deseja configurar um servidor de terminal ...)

    
por 10.03.2015 / 19:55
1

Você precisa ter certeza de ter as permissões de gravação de leitura corretas no dispositivo, você pode ver com:

$ls -l /dev/[serial device]

Eu confio no script que você encontrou e fez algumas modificações.

Para os sistemas de desenvolvimento que usei até agora, eles precisavam:

  • Nenhuma paridade e
  • Um bit de parada

Esses valores são os padrões no script.

Então, para se conectar, você pode usá-lo da seguinte forma:

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

Exemplo:

$./connect.sh /dev/ttyUSB0 19200

Script:

#!/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: Você precisa saber que tipo de alimentação de linha está usando seu sistema receptor, pois isso determinará como você precisará enviar os comandos no meu caso. Eu precisava de um Windows como LF, significa que preciso enviar

command\r

Valores ASCII para:

  • LF: 0Ah, feed de linha "\ n"
  • CR: 0Dh, retorno de carrige "\ r"
  • BS: 08h, espaço de retorno "< -"
por 09.07.2016 / 08:33
1

Outro problema que pode ocorrer é que sua conta de usuário pode precisar definir o grupo "discado" para acessar a porta serial.

sudo usermod -a -G dialout $USER
    
por 28.03.2018 / 18:42