是否有方法像使用SSH一样连接到串行终端?必须有比Minicom之类的工具更简单的方法,例如

$ serial /dev/ttyS0 


我知道我可以cat/dev/ttyS0的输出,但是这种方式只能进行一种通信,从端口到控制台。与echo输出到端口的端口是一样的,但是反过来,到端口。

如何在Unix / Linux上以最简单的方式实现与串行端口的双向通信?

评论

很好的答案!!不幸的是,在使用带有少量命令的嵌入式系统时,似乎没有人完全符合我的目的。但是,我确实找到了另一种使用Shell Scrip的方法,我将其添加为问题的答案之一。

#1 楼

我发现screen是串行通讯最有用的程序,因为无论如何我还是将它用于其他用途。尽管设备的默认设置可能有所不同,但通常仅为screen /dev/ttyS0 <speed>。它还允许您通过进入命令模式并执行exec !! <run some program that generates output>将任何内容通过管道传递到会话中。

评论


屏幕+1!另请参阅:serverfault.com/q/81544/11086

–乔什
2011-10-14 13:16

另请参见noah.org/wiki/Screen_notes#using_screen_as_a_serial_terminal和手册页stty(1),我必须添加其他选项(例如奇偶校验)才能使其工作。

– Lekensteyn
2012年3月20日22:22

感到as愧,我错误地连接了TX / RX:o

– Lekensteyn
2012年3月20日22:50

屏幕很棒,但是我不认为它比minicom更简单:-)

– Ciro Santilli郝海东冠状病六四事件法轮功
17年5月29日在16:57

@CiroSantilli刘晓波死六四事件法轮功-屏幕可能不比Minicom更简单,但是由于我已经使用了Screen,所以对我来说,使用Screen进行串行操作的复杂性较低,因此完全不需要Minicom。

–user62916
17年9月2日于13:02

#2 楼

背景
之所以需要minicom之类的程序通过串行端口进行通信的主要原因是,在启动连接之前需要先设置端口。如果未正确设置,则catecho命令将无法满足您的期望。请注意,一旦运行minicom之类的程序,该端口将保留minicom使用的设置。您可以使用stty程序查询通讯设置,如下所示:
stty < /dev/ttyS0

如果操作正确,请执行以下操作:在启动计算机之后,并且在运行任何其他程序(如minicom,)之前,通信设置将为默认设置。这些可能与您建立连接所需要的有所不同。在这种情况下,向端口发送命令catecho会产生垃圾或根本无法工作。
使用stty后再次运行minicom,您会注意到设置已设置为程序使用的内容。
最小的串行通信
基本上,通过串行端口进行双向通信需要两件事:1)配置串行端口,以及2)打开伪tty读写。 >我知道执行此操作的最基本程序是picocom。您还可以使用setserial之类的工具来设置端口,然后直接从外壳与之交互。

评论


picocom还可以让您连接到串行端口而无需重新配置它(--noinit),并且可以退出而无需恢复串行端口配置(--noreset或使用Ctrl-A / Ctrl-Q退出picocom)。我发现picocom比minicom更易于使用。由于我尚未弄清的原因,minicom有时有时根本不会在之前工作正常的端口上发送或接收数据,或者picocom不会遇到任何麻烦。这可能是一些不可思议的配置选项,但是无论如何我都无法弄清楚(而且这种现象发生在多台机器上)。

– Michael Burr
13-10-24在21:11

为picocom +1!我发现如果没有正确的行尾,我将无法向串行设备写入命令:我需要使用--omap crcrlf --echo选项

–user2561747
19-10-16在3:23

#3 楼

如果系统上已安装UUCP,则可以使用命令cu,例如

 $ cu -l /dev/ttyS0 -s 9600


评论


使用〜^ D或〜。退出。

– iman
19/09/14'7:57

#4 楼

我在这里找到了一种使用外壳程序脚本的方法,该脚本将cat用作后台进程,并创建了一个while循环来读取用户输入并将echo输入到端口。我对其进行了更广泛的修改,使其完全符合我的目的。

#!/bin/sh

# connect.sh

# Usage:
# $ connect.sh <device> <port speed>
# Example: connect.sh /dev/ttyS0 9600

# Set up device
stty -F  

# Let cat read the device  in the background
cat  &

# Capture PID of background process so it is possible to terminate it when done
bgPid=$!

# Read commands from user, send them to device 
while read cmd
do
   echo "$cmd" 
done > 

# Terminate background read process
kill $bgPid


评论


另外,我在下面做了一个稍微修改的版本,它也可以发送Ctrl + C和Ctrl + Z。

–弗里兹
16-09-22在17:06

@Fritz很好找到!因此,如果我做对了,后台进程将永远不会被杀死,因为$?似乎没有扩展到正确的地方吗?

– ihate注册
16-09-26在6:23

@ihatetoregister:不太正确。后台进程被杀死,但是不是出于人们可能期望的原因。 $?扩展为最后一个非后台命令的退出代码(在本例中为stty -F $ 1 $ 2),因此在没有错误的情况下扩展为0。因此,最后一行变为kill 0,这反过来又似乎杀死了当前的shell及其所有子级(我相信在交互式shell中,它的行为有所不同)。有关所有详细信息,请参见以下说明:unix.stackexchange.com/questions/67532/…

–弗里兹
16-09-26在9:03

但是,脚本中真正的陷阱是,仅当您按Ctrl + D结束脚本时,后台进程才会被杀死,因为这样可以完全结束while循环。如果使用Ctrl + C或kill命令将其杀死,则cat进程将保持活动状态。为了解决这个问题,您需要在外壳退出时使用trap命令执行kill $ bgPid,就像下面的脚本一样。老实说,如果您只是将整个脚本添加到您的帖子中,我什至都不介意。我试图这样做,但是编辑被拒绝了。

–弗里兹
16-09-26在11:08

您能否澄清连接的位置,因为答案中已对此进行了注释

–克里斯·哈克罗(Chris Halcrow)
16 Dec 9'在20:31



#5 楼

试试http://tio.github.io

“ tio”是一个简单的TTY终端应用程序,它具有简单的命令行界面,可以轻松连接到TTY设备以进行基本的输入/输出。

典型的使用是没有选择的。例如:

tio /dev/ttyS0


对应于常用选项:

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


它带有完整的外壳自动完成支持所有选项。

评论


我在Windows上使用msys2,并且您可以使用pacman -S tio安装tio,因为默认情况下它位于可用的软件包中。屏幕,picocom等不是。谢谢!

–科安尼·罗伯特(KohányiRóbert)
18年5月23日在13:11

#6 楼

该脚本基于另一个答案,但通过串行端口(Ctrl + Q除外)发送所有内容,而不仅仅是单个命令后跟Enter。这使您可以在远程主机上使用Ctrl + C或Ctrl + Z,并可以使用诸如aptitude或alsamixer之类的交互式“ GUI”程序。可以通过按Ctrl + Q退出。

只需将以下代码放入文件/usr/local/bin/femtocom(或$PATH中的任何其他位置)中,然后执行chmod +x /usr/local/bin/femtocom

从那里开始您可以连接到任何这样的串行端口,例如:

femtocom /dev/ttyUSB0 57600



#!/bin/bash

if [[ $# -lt 1 ]]; then
    echo "Usage:"
    echo "  femtocom <serial-port> [ <speed> [ <stty-options> ... ] ]"
    echo "  Example: q4312078q /dev/ttyS0 9600"
    echo "  Press Ctrl+Q to quit"
fi

set -e    # Exit when any command fails

# 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=""; 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

echo "Connecting to $port. Press Ctrl+Q to exit."

# 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=$!

cat >"$port"   # Redirect all keyboard input to serial port


#7 楼

顺便说一句,腻子包(确实在Linux上运行)确实包含串行支持。

#8 楼

可能发生的另一个问题是,您的用户帐户可能需要设置为“ dialout”组才能访问串行端口。

sudo usermod -a -G dialout $USER


#9 楼

Putty在Linux上运行良好,并提供了一些便利,特别是对于串行通信。它有一个我无法直接解决的缺点:从Putty窗口本身无法复制粘贴。 Windows版本具有一个可爱的自动复制功能,可将其突出显示到剪贴板上,并右键单击以粘贴行为(并且有出色的chrome和firefox插件可实现相同的行为),但是在Linux上,没有复制行为适合AFAIK。

如果缺少副本是一个问题(对我而言),请打开腻子登录并打开标准终端窗口,然后# tail -f putty.log和双向文本可用于标准copypasta操作。

评论


我发现Linux下的Putty不会粘贴“剪贴板”(使用control-C复制的内容),但是会在中间鼠标插入“主要选择”(您在某些程序中当前选择的内容)。同样,您可以在腻子的屏幕中选择字符以定义主要选择。但是,如果我希望将Putty屏幕中的文本传输到某些VM,则需要将其作为剪贴板,因此我必须使用中介程序从主要选择中接收文本,然后将其复制到剪贴板。

–卡迪夫太空人
17-2-28在19:58

#10 楼

如前所述,您可以尝试picocom。最新版本(2.0)也可以(安全地)用于设置“终端服务器”,因为它不再允许shell命令注入。请参阅:

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

#11 楼

这取决于您想做什么。您是否要从终端以交互方式运行外壳或应用程序,通过串行线路连接到另一台计算机,通过串行端口自动与设备通信?

如果您要进行双向通信,那么我想您想要与终端上的人员进行交互的东西。您可以通过在串行端口上设置getty(1)会话来配置系统以允许从终端通过串行端口登录-getty是用于设置终端并允许登录到该终端的工具。将条目放在inittab(5)文件中,以基于respawn在适当的串行端口上运行它。

如果要连接到设备并启动自动双向对话,则可以查看是否期望会给你你想要的。使用stty(1)将端口配置为正确的奇偶校验,波特率和其他相关设置。

如果要通过串行端口与另一台计算机进行交互通信,则需要终端仿真软件。这确实做了很多工作-它设置了端口,解释了ANSI或其他终端命令序列(ANSI远远不是串行终端支持的唯一标准)。许多终端仿真器还支持文件传输协议,例如kermit或zmodem。

串行通信和终端I / O的来龙去脉非常复杂;您可以在串行howto中获得比该主题更多的了解。

#12 楼

您需要确保在设备上具有正确的读写许可,您可以通过以下方式查看它:

$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 "" ] || [ -z "" ]; 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 ""   in
        2) stopb="cstopb";;
        *) stopb="-cstopb";;
    esac

    if [ "" = "even" ]; then
        par="-parodd"
    elif [ "" = "odd" ]; then
        par="parodd"
    else
        par="-parity"
    fi
    printf "\nThen stty -F   $stopb $par\n";
fi

# Set up device
stty -F "" "" "$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  in the background
cat -v "" &

# Capture PID of background process so it is possible to terminate it when done
bgPid="$!"

# Read commands from user, send them to device 
while [ "$cmd" != "exit" ]
do
   read cmd
   echo -e "\x08$cmd\x0D" > "" #strip off the \n that read puts and adds \r for windows like LF

done

# Terminate background read process
kill "$bgPid"


PS:您需要知道哪个一种换行方式正在使用您的接收器系统,因为这将确定您需要如何发送命令(对于我而言,我需要一个类似LF的Windows),这意味着我需要发送

command\r


ASCII值:


LF:0Ah,换行符“ \ n”
CR:0Dh,回车符“ \ r”
BS :08h,后退空格“ <-”


评论


(1)#!/ bin / sh如果不是文件的第一行,则会被忽略。 (2)认真吗?您是使用1来指定偶数奇偶校验,还是使用2来指定奇数? (3)按照惯例,有一条“使用情况”或“帮助”消息记录所有参数,而不仅仅是强制性参数。 (4)您应该始终引用您的shell变量引用(例如,“ $ 1”,“ $ 2”,“ $ 3”,“ $ 4”,“ $ stopb”,“ $ par”,“ $ bgPid”,甚至“ $?”)。 ”和“ $!”),除非您有充分的理由不这样做,并且您确定自己知道自己在做什么。

–斯科特
16年7月9日在7:15

#13 楼

我不知道为什么没有人提到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


或者甚至在路由器上设置端口转发并将其公开给Internet,以便您可以从任何地方连接到它(让我们跳过安全性问题,我在谈论灵活性)。

#14 楼

由于此处尚未提及,因此我还要提及socat-https://stackoverflow.com/questions/2899180/how-can-i-use-com-and-usb-ports-within-cygwin中的更多信息:

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




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


(尽管如此,我遇到了一旦启动就将其停止的问题在Windows上的MSYS2下运行)

#15 楼

您可能想看看

http://serialconsole.sourceforge.net

Pro:不会像minicom或picocom那样存在明显的安全问题(如果您没有为用户提供外壳程序访问权限没有问题,没问题,但是如果您要设置终端服务器,则很可能确实有一个问题...)

#16 楼

另一个简单的选择是使用-X标志通过ssh访问计算机并运行诸如putty或gtkterm之类的程序。

So:

$ ssh -X <user>@<machine_address>

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

$ gtkterm


它将启动客户端PC上的图形界面,从那里可以像访问主机一样访问串行端口。

免责声明:仅在ubuntu机器上尝试过此操作。我猜想它不能在没有图形界面的机器上使用。

从ssh手册中:


-X

启用X11转发。也可以在每个主机的配置文件中指定它。
应谨慎启用X11转发。能够绕过远程主机(针对用户的X授权数据库)上的文件权限的用户可以通过转发的连接访问本地X11显示。然后,攻击者可能可以执行诸如按键监视之类的活动。
因此,默认情况下,X11转发受X11 SECURITY扩展限制。有关更多信息,请参考ssh -Y选项和ssh_config(5)中的ForwardX11Trusted指令。

-Y

启用受信任的X11转发。受信任的X11转发不受X11 SECURITY扩展控件的约束。


因此如果存在安全问题,请使用-Y