$ serial /dev/ttyS0
我知道我可以
cat
从/dev/ttyS0
的输出,但是这种方式只能进行一种通信,从端口到控制台。与echo
输出到端口的端口是一样的,但是反过来,到端口。 如何在Unix / Linux上以最简单的方式实现与串行端口的双向通信?
#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
之类的程序通过串行端口进行通信的主要原因是,在启动连接之前需要先设置端口。如果未正确设置,则cat
和echo
命令将无法满足您的期望。请注意,一旦运行minicom
之类的程序,该端口将保留minicom
使用的设置。您可以使用stty
程序查询通讯设置,如下所示:stty < /dev/ttyS0
如果操作正确,请执行以下操作:在启动计算机之后,并且在运行任何其他程序(如
minicom,
)之前,通信设置将为默认设置。这些可能与您建立连接所需要的有所不同。在这种情况下,向端口发送命令cat
或echo
会产生垃圾或根本无法工作。使用
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
。
评论
很好的答案!!不幸的是,在使用带有少量命令的嵌入式系统时,似乎没有人完全符合我的目的。但是,我确实找到了另一种使用Shell Scrip的方法,我将其添加为问题的答案之一。