Làm cách nào để kết nối với cổng nối tiếp đơn giản như sử dụng SSH?


86

Có cách nào để kết nối với thiết bị đầu cuối nối tiếp giống như bạn làm với SSH không? Phải có một cách đơn giản hơn các công cụ như Minicom, như thế này

$ serial /dev/ttyS0 

Tôi biết tôi có thể catđầu ra từ /dev/ttyS0nhưng chỉ có một cách có thể giao tiếp theo cách đó, từ cổng đến bàn điều khiển. Và echora cảng cũng vậy, nhưng ngược lại, đến cảng.

Làm cách nào tôi có thể nhận ra giao tiếp hai chiều với một cổng nối tiếp theo cách đơn giản nhất có thể có trên Unix / Linux?


2
Câu trả lời tuyệt vời mọi người!. Thật không may, dường như không ai hoàn toàn phù hợp với mục đích của tôi khi làm việc với các hệ thống nhúng với một bộ lệnh giới hạn. Tuy nhiên, tôi đã tìm một cách khác bằng cách sử dụng scrip shell mà tôi thêm vào như một trong những câu trả lời cho câu hỏi của mình.
ihatetoregister

Câu trả lời:


69

Tôi tìm thấy screenchương trình hữu ích nhất cho giao tiếp nối tiếp vì dù sao tôi cũng sử dụng nó cho những thứ khác. Nó thường chỉ screen /dev/ttyS0 <speed>, mặc dù các cài đặt mặc định có thể khác nhau cho thiết bị của bạn. Nó cũng cho phép bạn chuyển mọi thứ vào phiên bằng cách vào chế độ lệnh và thực hiện exec !! <run some program that generates output>.


3
+1 cho màn hình! Ngoài ra, hãy xem: serverfault.com/q/81544/11086
Josh

1
Xem thêm noah.org/wiki/Screen_notes#USE_screen_as_a_serial_terminal và trang hướng dẫn stty (1), tôi đã phải thêm các tùy chọn bổ sung (ví dụ như tính chẵn lẻ) để nó hoạt động.
Lekensteyn

3
cảm thấy xấu hổ Tôi đã kết nối sai TX / RX: o
Lekensteyn

screenlà tuyệt vời, nhưng tôi không nghĩ nó đơn giản hơn minicom:-)
Ciro Santilli 心 心 事件

1
@CiroSantilli.
yeti

48

Lý lịch

Lý do chính tại sao bạn cần bất kỳ chương trình nào muốn minicomgiao tiếp qua cổng nối tiếp là cổng cần được thiết lập trước khi bắt đầu kết nối. Nếu nó không được thiết lập phù hợp, các lệnh catecholệnh sẽ không làm cho bạn những gì bạn có thể mong đợi. Lưu ý rằng một khi bạn chạy một chương trình như thế minicom, cổng sẽ được để lại với các cài đặt minicomđược sử dụng. Bạn có thể truy vấn cài đặt liên lạc bằng sttychương trình như thế này:

stty < /dev/ttyS0

Nếu bạn đã làm đúng; sau khi khởi động máy tính và trước khi chạy bất kỳ chương trình nào khác như minicom,cài đặt liên lạc sẽ ở cài đặt mặc định của chúng. Đây có thể là khác nhau hơn những gì bạn sẽ cần để thực hiện kết nối của bạn. Trong tình huống này, gửi lệnh cathoặc echođến cổng sẽ tạo ra rác hoặc hoàn toàn không hoạt động.

Chạy sttylại sau khi sử dụng minicomvà bạn sẽ thấy các cài đặt được đặt thành những gì chương trình đang sử dụng.

Truyền thông nối tiếp tối thiểu

Về cơ bản, cần có hai điều để có giao tiếp hai chiều thông qua cổng nối tiếp: 1) định cấu hình cổng nối tiếp và 2) mở đọc giả ghi.

Chương trình cơ bản nhất mà tôi biết đó là picocom. Bạn cũng có thể sử dụng một công cụ như setserialđể thiết lập cổng và sau đó tương tác với nó trực tiếp từ trình bao.


5
picocomcũng sẽ cho phép bạn kết nối với một cổng nối tiếp mà không cần cấu hình lại nó ( --noinit) và sẽ cho phép bạn thoát mà không khôi phục cấu hình cổng nối tiếp ( --noresethoặc sử dụng Ctrl-A/ Ctrl-Qđể thoát picocom). Tôi thấy picocomdễ sử dụng hơn nhiều minicom. Vì những lý do tôi chưa tìm ra, đôi khi đơn giản là sẽ không gửi hoặc nhận dữ liệu trên một cổng hoạt động trước đó hoặc picocom không gặp vấn đề gì. Đây có thể là một số tùy chọn cấu hình phức tạp, nhưng dù tôi không thể tìm ra nó (và hành vi này đã xảy ra trên nhiều máy).
Michael Burr

+1 cho picocom! Tôi thấy rằng tôi không thể viết lệnh cho thiết bị nối tiếp mà không có kết thúc dòng chính xác: Tôi cần sử dụng --omap crcrlf --echocác tùy chọn
user2561747

24

Nếu UUCP được cài đặt trên hệ thống, bạn có thể sử dụng lệnh cu , vd

 $ cu -l /dev/ttyS0 -s 9600

Sử dụng ~^Dhoặc ~.để thoát.
iman

24

Tôi đã tìm thấy một cách sử dụng tập lệnh shell ở đây đặt catlàm quá trình nền và vòng lặp while đọc đầu vào của người dùng và echonó ra cổng. Tôi đã sửa đổi nó để chung chung hơn và nó phù hợp với mục đích của tôi một cách hoàn hảo.

#!/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
Ngoài ra, tôi đã tạo một phiên bản sửa đổi một chút bên dưới , cũng có thể gửi Ctrl + C và Ctrl + Z.
Fritz

@Fritz Đẹp tìm! Vì vậy, nếu tôi hiểu đúng, quá trình nền sẽ không bao giờ bị giết vì $? dường như không mở rộng ra bất cứ điều gì phải không?
ihatetoregister

1
@ihatetoregister: Không hoàn toàn chính xác. Quá trình nền bị giết, nhưng không phải vì những lý do mà người ta có thể mong đợi. $?mở rộng tới mã thoát của lệnh không nền sau cùng (trong trường hợp này stty -F $1 $2), vì vậy nó sẽ mở rộng về 0 khi không có lỗi. Do đó, dòng cuối cùng trở thành kill 0cái mà dường như giết chết lớp vỏ hiện tại và tất cả các con của nó (nó hoạt động khác nhau trong lớp vỏ tương tác mà tôi tin). Để biết tất cả các chi tiết, hãy xem phần giải thích sau: unix.stackexchange.com/questions/67532/iêu
Fritz

1
Howerver, gotcha thực sự trong tập lệnh của bạn là quá trình nền chỉ bị hủy nếu bạn nhấn Ctrl + D để kết thúc tập lệnh của mình, vì điều đó kết thúc whilevòng lặp một cách sạch sẽ. Nếu bạn giết nó bằng Ctrl + C hoặc bằng killlệnh, thì catquá trình vẫn tồn tại. Để khắc phục rằng bạn sẽ cần sử dụng traplệnh để thực thi kill $bgPidkhi shell thoát ra, giống như tập lệnh của tôi bên dưới . Thành thật mà nói, tôi thậm chí sẽ không phiền nếu bạn chỉ thêm toàn bộ kịch bản của tôi vào bài viết của bạn. Tôi đã cố gắng để làm điều đó, nhưng chỉnh sửa đã bị từ chối.
Fritz

Bạn có thể vui lòng làm rõ nơi kết nối đến, vì điều này được nhận xét trong câu trả lời của bạn
Chris Halcrow

14

Hãy thử http://tio.github.io

"Tio" là một ứng dụng đầu cuối TTY đơn giản có giao diện dòng lệnh đơn giản để dễ dàng kết nối với các thiết bị TTY cho đầu vào / đầu ra cơ bản.

Sử dụng điển hình là không có tùy chọn. Ví dụ:

tio /dev/ttyS0

Tương ứng với các tùy chọn thường được sử dụng:

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

Nó đi kèm với hỗ trợ hoàn thành tự động shell đầy đủ cho tất cả các tùy chọn.


3
Tôi đang sử dụng msys2trên Windows và bạn có thể cài đặt tiocùng với pacman -S tiovì đây là một trong các gói có sẵn theo mặc định. screen,, picocomvv không. Cảm ơn!
Kohányi Róbert

12

Kịch bản này dựa trên một câu trả lời khác , nhưng sẽ gửi mọi thứ qua cổng nối tiếp (ngoại trừ Ctrl + Q), không chỉ các lệnh đơn theo sau Enter. Điều này cho phép bạn sử dụng Ctrl + C hoặc Ctrl + Z trên máy chủ từ xa và sử dụng các chương trình "GUI" tương tác như aptitude hoặc alsamixer. Nó có thể được thoát bằng cách nhấn 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

BTW, gói putty (chạy trên Linux) không bao gồm hỗ trợ nối tiếp.


4

Một vấn đề khác có thể xảy ra là tài khoản người dùng của bạn có thể cần được đặt thành nhóm "quay số" để truy cập vào cổng nối tiếp.

sudo usermod -a -G dialout $USER

3

Putty hoạt động tốt trên Linux và cung cấp một số tiện lợi, đặc biệt là cho các giao tiếp nối tiếp. Nó có một nhược điểm mà tôi chưa thể giải quyết trực tiếp: không có bản sao-dán từ chính cửa sổ Putty. Phiên bản windows có tính năng tự động sao chép đáng yêu vào clipboard ở chế độ nổi bật, nhấp chuột phải để dán hành vi (và có các plugin tuyệt vời cho cả chrome và firefox để kích hoạt cùng một hành vi), nhưng trên Linux, không có bản sao nào yêu thích AFAIK.

Nếu thiếu bản sao là một vấn đề (đối với tôi) thì hãy bật đăng nhập putty và mở một cửa sổ đầu cuối tiêu chuẩn # tail -f putty.logvà văn bản hai chiều có sẵn cho hành động copypasta tiêu chuẩn.


1
Tôi thấy rằng Putty trong Linux không dán "bảng tạm" (những gì bạn sao chép bằng control-C), nhưng nó sẽ chèn "lựa chọn chính" (những gì bạn hiện đang chọn trong một số chương trình) bằng chuột giữa. Tương tự như vậy, bạn có thể chọn các ký tự trong màn hình của Putty để xác định lựa chọn chính. Nhưng nếu tôi muốn văn bản từ màn hình Putty chuyển sang một số VM, tôi cần nó là bảng tạm, vì vậy tôi phải sử dụng chương trình trung gian để nhận văn bản từ lựa chọn chính và sau đó sao chép nó vào bảng tạm.
người đàn ông không gian


2

Nó phụ thuộc vào những gì bạn muốn làm. Bạn có muốn chạy shell hoặc applicaiton tương tác từ thiết bị đầu cuối, kết nối với một máy tính khác qua đường nối tiếp, tự động hóa giao tiếp với một thiết bị qua cổng nối tiếp?

Nếu bạn muốn giao tiếp hai chiều thì tôi cho rằng bạn muốn một cái gì đó tương tác với một con người trên thiết bị đầu cuối. Bạn có thể định cấu hình hệ thống để cho phép đăng nhập từ thiết bị đầu cuối qua cổng nối tiếp bằng cách thiết lập phiên getty (1) trên cổng nối tiếp - getty là công cụ để thiết lập thiết bị đầu cuối và cho phép đăng nhập vào thiết bị đầu cuối. Đặt một mục trong tệp inittab (5) của bạn để chạy nó trên cổng nối tiếp thích hợp trên respawncơ sở.

Nếu bạn muốn kết nối với một thiết bị và bắt đầu các cuộc hội thoại hai chiều tự động thì bạn có thể xem liệu kỳ vọng sẽ mang lại cho bạn những gì bạn muốn. Sử dụng stty (1) để định cấu hình cổng theo đúng chẵn lẻ, tốc độ truyền và các cài đặt liên quan khác.

Nếu bạn muốn giao tiếp tương tác với một máy tính khác qua cổng nối tiếp thì bạn sẽ cần phần mềm mô phỏng thiết bị đầu cuối. Điều này thực hiện khá nhiều - nó thiết lập cổng, diễn giải ANSI hoặc các chuỗi lệnh đầu cuối khác (ANSI không phải là tiêu chuẩn duy nhất được hỗ trợ bởi các thiết bị đầu cuối nối tiếp). Nhiều trình giả lập thiết bị đầu cuối cũng hỗ trợ các giao thức truyền tệp như kermit hoặc zmodem.

Các hoạt động trong và ngoài của truyền thông nối tiếp và I / O đầu cuối khá phức tạp; bạn có thể đọc nhiều hơn bạn từng muốn biết về chủ đề trong cách làm nối tiếp.


1

Bạn có thể muốn xem qua

http://serialconsole.sourceforge.net

Pro: không có vấn đề bảo mật rõ ràng như minicom hoặc picocom (nếu bạn không gặp vấn đề gì khi cấp quyền truy cập shell cho người dùng, không có vấn đề gì, nhưng rất có thể bạn sẽ gặp phải nếu bạn muốn thiết lập máy chủ đầu cuối ... )


1

Bạn cần chắc chắn có giấy phép đọc chính xác trên thiết bị, bạn có thể xem nó với:

$ls -l /dev/[serial device]

Tôi dựa vào kịch bản bạn tìm thấy và thực hiện một số sửa đổi.

Đối với các hệ thống phát triển mà tôi đã sử dụng bây giờ, chúng đã từng cần:

  • Không ngang giá và
  • Một điểm dừng

Những giá trị này là giá trị mặc định trong tập lệnh.

Vì vậy, để kết nối, bạn có thể sử dụng nó đơn giản như sau:

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

Thí dụ:

$./connect.sh /dev/ttyUSB0 19200

Kịch bản:

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

Tái bút: Bạn cần biết loại nguồn cấp dữ liệu nào đang sử dụng hệ thống máy thu của mình vì điều này sẽ xác định cách bạn sẽ cần gửi các lệnh trong trường hợp của mình Tôi cần một Windows như LF, nghĩa là tôi cần gửi

command\r

Giá trị ASCII cho:

  • LF: 0AH, nguồn cấp dữ liệu "\ n"
  • CR: 0Dh, trả lại tiền lãi "\ r"
  • BS: 08h, quay lại không gian "<-"

1
(1)  #!/bin/shbị bỏ qua nếu đó không phải là dòng đầu tiên của tệp. (2) Nghiêm túc? Bạn đang sử dụng 1để xác định thậm chí chẵn lẻ và 2để xác định lẻ ? (3) Đó là thông thường để có một “sử dụng” hoặc “giúp đỡ” thông điệp rằng tài liệu tất cả các thông số, chứ không phải chỉ là những người bắt buộc. (4) Bạn nên luôn luôn trích dẫn tài liệu tham khảo vỏ biến của bạn (ví dụ "$1", "$2", "$3", "$4", "$stopb", "$par", "$bgPid", và thậm chí "$?""$!") trừ khi bạn có lý do chính đáng không, và bạn chắc chắn bạn biết những gì bạn đang làm.
Scott


1

Tôi tự hỏi tại sao không ai nhắc đến ser2net .

Ví dụ /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

Bạn có thể kết nối với cổng nối tiếp dễ dàng như:

telnet localhost 3000

Hoặc từ xa:

telnet <ip> 3000

Hoặc thậm chí thiết lập chuyển tiếp cổng trên bộ định tuyến của bạn và hiển thị nó với Internet, để bạn có thể kết nối với nó từ bất cứ đâu (hãy bỏ qua các vấn đề bảo mật, tôi đang nói về tính linh hoạt).


0

Một tùy chọn dễ dàng khác là truy cập máy qua ssh bằng -Xcờ và chạy chương trình như putty hoặc gtkterm.

Vì thế:

$ ssh -X <user>@<machine_address>

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

$ gtkterm

Nó sẽ khởi chạy giao diện đồ họa trên PC khách của bạn và từ đó bạn có thể truy cập cổng nối tiếp như thể bạn sẽ ở trong máy chủ.

Disclaimer: Chỉ thử điều này với các máy ubfox. Tôi đoán rằng nó sẽ không hoạt động với các máy không có giao diện đồ họa.

Từ hướng dẫn sử dụng ssh:

-X

Cho phép chuyển tiếp X11. Điều này cũng có thể được chỉ định trên cơ sở từng máy chủ trong tệp cấu hình. Chuyển tiếp X11 nên được kích hoạt một cách thận trọng. Người dùng có khả năng bỏ qua quyền truy cập tệp trên máy chủ từ xa (đối với cơ sở dữ liệu ủy quyền X của người dùng) có thể truy cập vào màn hình X11 cục bộ thông qua kết nối được chuyển tiếp. Kẻ tấn công sau đó có thể thực hiện các hoạt động như theo dõi tổ hợp phím. Vì lý do này, chuyển tiếp X11 phải chịu các hạn chế mở rộng X11 AN NINH theo mặc định. Vui lòng tham khảo tùy chọn ssh -Y và chỉ thị ForwardX11Trust trong ssh_config (5) để biết thêm thông tin.

-Y

Cho phép chuyển tiếp X11 đáng tin cậy. Chuyển tiếp đáng tin cậy X11 không chịu sự kiểm soát của tiện ích mở rộng X11 AN NINH.

Vì vậy, sử dụng -Ynếu bảo mật là một vấn đề.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.