SSH를 사용하는 것처럼 간단하게 직렬 포트에 연결하는 방법은 무엇입니까?


86

SSH에서와 마찬가지로 직렬 터미널에 연결하는 방법이 있습니까? Minicom과 같은 도구보다 간단한 방법이 있어야합니다.

$ serial /dev/ttyS0 

나는 cat출력을 할 수 /dev/ttyS0있지만 포트에서 콘솔까지 단방향 통신 만 가능하다는 것을 알고 있습니다 . 그리고 echo항구로 나가는 것은 항구와 똑같지 만 다른 방향으로 향합니다.

유닉스 / 리눅스에서 가능한 가장 간단한 방법으로 직렬 포트와 양방향 통신을 실현하려면 어떻게해야합니까?


2
사람들에게 큰 답변!. 불행히도 제한된 일련의 명령으로 임베디드 시스템으로 작업 할 때 아무도 내 목적에 완전히 부합하지 않는 것 같습니다. 그러나 쉘 스크립을 사용하여 다른 방법을 찾았습니다.이 질문에 대한 답변 중 하나를 추가했습니다.
ihatetoregister

답변:


69

screen어쨌든 다른 용도로 사용하기 때문에 직렬 통신에 가장 유용한 프로그램을 찾습니다 . screen /dev/ttyS0 <speed>기본 설정은 기기에 따라 다를 수 있지만 일반적으로는 입니다. 또한 명령 모드로 들어가서을 수행하여 세션에 무엇이든 파이프 할 수 있습니다 exec !! <run some program that generates output>.


3
화면 +1! 또한 참조 : serverfault.com/q/81544/11086
Josh

1
도 참조 noah.org/wiki/Screen_notes#using_screen_as_a_serial_terminal 및 매뉴얼 페이지의 stty (1), 나는 그것이 작동하려면 추가 옵션 (예 : 패리티)를 추가했다.
Lekensteyn

3
부끄러워 느낌 내가 잘못 TX / RX 연결 : 오
Lekensteyn

screen굉장합니다,하지만 난 그것을보다 간단 그것을 생각하지 않는다 minicom:-)
치로 틸리가新疆改造中心法轮功六四事件

1
@CiroSantilli 刘晓波 死 六四 事件 法轮功-화면은 Minicom보다 단순하지 않을 수도 있지만 이미 화면을 사용하고 있기 때문에 화면으로 직렬 작업을 수행하는 것이 복잡하지 않으므로 Minicom이 필요하지 않습니다.
yeti

48

배경

당신이 필요로하는 주된 이유 어떤 프로그램이 좋아하는 minicom시리얼 포트를 통해 통신 할 포트가 될 필요가 있다는 것입니다 설정할 연결을 시작하기 전에. 제대로 설정되지 않은 경우 catecho명령은 예상 한대로 수행하지 않습니다. 와 같은 프로그램을 실행 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에 아무런 문제가없는 포트에서 데이터를 보내거나받지 못할 것입니다. 아마도 일부 구성 옵션 일 수도 있지만 그것이 무엇이든 알아낼 수는 없습니다 (이 동작은 두 대 이상의 컴퓨터에서 발생했습니다).
Michael Burr

picocom의 +1! 올바른 줄 --omap crcrlf --echo
끝없이

24

UUCP이 시스템에 설치되어있는 경우, 명령 사용할 수 있습니다 세제곱 , 예를 들어,

 $ cu -l /dev/ttyS0 -s 9600

~^D또는 ~.을 사용 하여 종료하십시오.
iman

24

나는 쉘 스크립트를 사용하는 방법을 발견 여기에 넣어 cat백그라운드 프로세스 및 사용자 입력을 읽을 while 루프로 및 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를 보낼 수도 있습니다.
프리츠

@ 프리츠 좋은 발견! 따라서이 권리를 얻으면 $ 때문에 백그라운드 프로세스가 종료되지 않습니다. 제대로 확장되지 않는 것 같습니까?
ihatetoregister

1
@ihatetoregister : 정확하지 않습니다. 백그라운드 프로세스가 종료되었지만 예상 할 수없는 이유는 아닙니다. $?백그라운드가 아닌 마지막 명령 (이 경우 stty -F $1 $2) 의 종료 코드로 확장되므로 오류가 없으면 0으로 확장됩니다. 따라서 마지막 줄은 kill 0현재 쉘과 모든 자식을 죽이는 것처럼 보입니다 (내가 믿는 대화 형 쉘에서는 다르게 작동합니다). 자세한 내용은 다음 설명을 참조하십시오 : unix.stackexchange.com/questions/67532/…
Fritz

1
Howerver, 스크립트에서 실제 잡았다는 백그라운드 프로세스가되어 있다는 것입니다 그가 끝나는 때문에, 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
내가 사용하고 msys2Windows에서 당신은 설치 tiopacman -S tio는 기본적으로 사용할 수있는 패키지들 때문에. screen, picocom, 등 수 없습니다. 감사!
Kohányi Róbert

12

이 스크립트는 다른 답변을 기반으로 하지만 단일 명령 다음에 오는 것이 아니라 직렬 포트를 통해 모든 내용 을 보냅니다 (Ctrl + Q 제외) Enter. 원격 호스트에서 Ctrl + C 또는 Ctrl + Z를 사용하고 적성 또는 alsamixer와 같은 대화식 "GUI"프로그램을 사용할 수 있습니다. 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에서 실행되는) 인 BTW에는 직렬 지원이 포함됩니다.


4

발생할 수있는 또 다른 문제는 직렬 포트에 액세스하기 위해 사용자 계정을 "전화 걸기"그룹으로 설정해야 할 수도 있습니다.

sudo usermod -a -G dialout $USER

3

Putty는 Linux에서 잘 작동하며 특히 직렬 통신의 경우 약간의 편의성을 제공합니다. Putty 창 자체에서 복사하여 붙여 넣기를 할 수 없습니다. Windows 버전은 강조 표시시 클립 보드에 자동 복사가 가능하고 마우스 오른쪽 버튼을 클릭하여 동작을 붙여 넣습니다 (크롬과 파이어 폭스가 동일한 동작을 가능하게하는 훌륭한 플러그인이 있음).하지만 Linux에서는 AFAIK를 좋아하지 않습니다.

복사 부족이 문제인 경우 (나를위한) 퍼티 로그인을 켜고 표준 터미널 창을 열고 # tail -f putty.log표준 copypasta 작업에 양방향 텍스트를 사용할 수 있습니다.


1
Linux의 Putty는 "클립 보드"(control-C로 복사 한 것)를 붙여 넣지 않지만 마우스로 "기본 선택"(현재 일부 프로그램에서 선택한 것)을 삽입합니다. 마찬가지로 퍼티 화면에서 문자를 선택하여 기본 선택을 정의 할 수 있습니다. 그러나 퍼티 화면의 텍스트를 일부 VM으로 전송하려면 클립 보드가 필요하므로 중간 선택 프로그램을 사용하여 기본 선택에서 텍스트를 수신 한 다음 클립 보드에 복사해야합니다.
카디프 우주 남자


2

당신이하고 싶은 일에 달려 있습니다. 터미널에서 대화식으로 셸 또는 응용 프로그램을 실행하고 직렬 회선을 통해 다른 컴퓨터에 연결하고 직렬 포트를 통해 장치와의 통신을 자동화 하시겠습니까?

양방향 통신을 원한다면 터미널에서 사람과 대화식으로 무언가를 원한다고 가정합니다. 직렬 포트에서 getty (1) 세션을 설정하여 직렬 포트를 통한 터미널 로그인을 허용하도록 시스템을 구성 할 수 있습니다. getty는 터미널을 설정하고 로그인을 허용하는 도구입니다. inittab (5) 파일에 항목을 넣어 적절한 직렬 포트에서 실행하십시오 respawn.

장치에 연결하고 자동 양방향 대화를 시작 하려는 경우 예상 이 원하는 것을 얻을 수 있는지 확인할 수 있습니다. 사용 (1)의 stty를 올바른 패리티, 전송 속도 및 기타 관련 설정으로 포트를 구성 할 수 있습니다.

직렬 포트를 통해 다른 컴퓨터와 대화식으로 통신하려면 터미널 에뮬레이션 소프트웨어가 필요합니다. 이것은 포트를 설정하고 ANSI 또는 다른 터미널 명령 시퀀스를 해석합니다 (ANSI는 직렬 터미널이 지원하는 유일한 표준이 아닙니다). 많은 터미널 에뮬레이터는 kermit 또는 zmodem과 같은 파일 전송 프로토콜도 지원합니다.

직렬 통신 및 터미널 I / O의 입출력은 상당히 복잡합니다. 연속적인 하우투 에서 주제에 대해 알고 싶은 것보다 더 많은 것을 읽을 수 있습니다 .


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"

추신 : 수신기 시스템을 사용하는 종류의 줄 바꿈을 알아야합니다.이 경우 내 명령에서 어떻게 명령을 보내야하는지 결정하기 때문에 LF와 같은 Windows가 필요합니다.

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", 심지어 "$?""$!") 당신이하지가 좋은 이유가, 당신은 당신이 무슨 일을하는지 알고 확신하지 않는 한.
Scott


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

또 다른 쉬운 옵션은 -X플래그를 사용하여 ssh를 통해 시스템에 액세스하고 putty 또는 gtkterm과 같은 프로그램을 실행하는 것입니다.

그래서:

$ ssh -X <user>@<machine_address>

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

$ gtkterm

클라이언트 PC에서 그래픽 인터페이스를 시작해야하며 마치 마치 마치 호스트에있는 것처럼 직렬 포트에 액세스 할 수 있습니다.

면책 조항 : 우분투 컴퓨터에서만 이것을 시도했습니다. 그래픽 인터페이스가없는 컴퓨터에서는 작동하지 않을 것이라고 생각합니다.

ssh 매뉴얼에서 :

-엑스

X11 전달을 활성화합니다. 구성 파일에서 호스트별로 지정할 수도 있습니다. X11 전달은주의해서 활성화해야합니다. 원격 호스트 (사용자의 X 권한 데이터베이스의 경우)에서 파일 권한을 무시할 수있는 사용자는 전달 된 연결을 통해 로컬 X11 디스플레이에 액세스 할 수 있습니다. 그런 다음 공격자는 키 입력 모니터링과 같은 활동을 수행 할 수 있습니다. 이러한 이유로 X11 전달에는 기본적으로 X11 SECURITY 확장 제한이 적용됩니다. 자세한 내용은 ssh -Y 옵션 및 ssh_config (5)의 ForwardX11Trusted 지시문을 참조하십시오.

-와이

신뢰할 수있는 X11 전달을 활성화합니다. 신뢰할 수있는 X11 전달에는 X11 SECURITY 확장 컨트롤이 적용되지 않습니다.

따라서 -Y보안이 문제가되는 경우 사용 하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.