使用 Screen 连接串行终端的本地回显

Pak*_*Pak 9 terminal bash serial-port gnu-screen macos

通过阅读“构建无线传感器网络”一书,我了解到您可以使用 Screen 实用程序连接到串行控制台。我尝试使用它连接到 XBee 模块,它似乎工作正常,只是它没有在终端中回显本地键入的字符。到目前为止,我发现的唯一似乎有帮助的方法是使用 stty 实用程序在 tty 设备上设置“echo”选项,但更改似乎没有生效。我在 tty 设备上运行 stty 并通过它“echo”。如果我再次运行 stty 以打印出当前选项,它仍然显示“-echo”已设置。如果我对语法的理解是正确的,破折号表示该选项已关闭,没有破折号表示它已打开。我也试过用 sudo 设置 echo 选项,但那没有

我显然在这方面不是很了解,所以任何帮助将不胜感激。

小智 9

我在尝试以 115200 波特连接到串行设备时遇到了完全相同的问题。我正在运行 RHEL V5。

uname -a
Run Code Online (Sandbox Code Playgroud)

给出:

Linux localhost.localdomain 2.6.32-100.0.19.el5 
#1 SMP Fri Sep 17 17:51:41 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

经过一番挖掘,我发现了这个:

sudo screen /dev/ttyS0 115200,cs8,-parenb,-cstopb,echo
Run Code Online (Sandbox Code Playgroud)

或这个:

sudo screen /dev/ttyS0 115200,cs8,-parenb,-cstopb,inlcr,onlret,echo
Run Code Online (Sandbox Code Playgroud)

但是,正如您所指出的,当执行 screen 命令时,所选串行端口(在本例中为 /dev/ttyS0)的 echo 属性将恢复为

-echo  
Run Code Online (Sandbox Code Playgroud)

这可以通过命令验证

sudo stty -F /dev/ttyS0 -a
Run Code Online (Sandbox Code Playgroud)

在单独的终端窗口中。

此外,我发现从屏幕会话中分离使用

ctrl-A d
Run Code Online (Sandbox Code Playgroud)

是个坏主意,因为您无法重新连接。我们来看一个典型的调用:

[iceman@localhost ~]$ sudo stty -F /dev/ttyS0 echo
[iceman@localhost ~]$ sudo screen /dev/ttyS0 115200,cs8,-parenb,-cstopb,echo
[detached]
[iceman@localhost ~]$ ps aux | grep SCREEN
root      3779  0.0  0.1  78476  2876 ?        Ss   11:05   0:00 SCREEN       /dev/ttyS0 115200,cs8,-parenb,-cstopb,echo
iceman    3781  0.0  0.0  61152   740 pts/6    S+   11:05   0:00 grep SCREEN
[iceman@localhost ~]$ screen -ls
No Sockets found in /var/run/screen/S-iceman.
[iceman@localhost ~]$ 
Run Code Online (Sandbox Code Playgroud)

所以我们分离的 screen 会话仍在运行,但 screen -ls 显示 NADA。当附加到 /dev/ttyS0 的 screen 会话仍在运行时,让我们看一下 echo 的状态(上面设置为 active)。如果我们现在检查 /dev/ttyS0 的状态,我们会看到 echo 已关闭:

[iceman@localhost ~]$ sudo stty -F /dev/ttyS0 -a
speed 115200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^H; eof = ^D; eol = <undef>; eol2 =  <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z;
rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 100; time = 2;
-parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts -cdtrdsr
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
[iceman@localhost ~]$ 
Run Code Online (Sandbox Code Playgroud)

最后,尝试其他替代方法来重新附加:

[iceman@localhost ~]$ screen -x
There is no screen to be attached.
[iceman@localhost ~]$ screen -r
There is no screen to be resumed.
[iceman@localhost ~]$ 
Run Code Online (Sandbox Code Playgroud)

这可能是浪费大量时间的根源,因为搜索小写“屏幕”的进程将一无所获!

重要提示:如果在同一个串行端口上有多个屏幕会话,则尝试确定正在发生的事情将产生随机结果,具体取决于哪个进程“捕获”了串行端口中断。

正如您所说的 Pak,无论出于何种原因,屏幕中的 echo 选项都不会传递给 stty,事实上,无论您使用 -echo 还是 echo,当使用 /dev/ 屏幕调用时,stty 都会设置为 -echo ttyS0 作​​为指定的串口。(我已经证实了这一点)

我通过使用 minicom 找到了一个解决方案,如下所示:

sudo minicom -s
Run Code Online (Sandbox Code Playgroud)

然后在串口菜单下设置串口如下:

A -    Serial Device      : /dev/ttyS0
B - Lockfile Location     : /var/lock
C -   Callin Program      : 
D -  Callout Program      :  
E -    Bps/Par/Bits       : 115200 8N1
F - Hardware Flow Control : No 
G - Software Flow Control : No
Run Code Online (Sandbox Code Playgroud)

然后另存为“ser1”并使用命令:

sudo minicom ser1
Run Code Online (Sandbox Code Playgroud)

这将启动 minicom,然后您可以使用它:

ctrl-A E
Run Code Online (Sandbox Code Playgroud)

打开本地回声和

ctrl-A A
Run Code Online (Sandbox Code Playgroud)

将换行符附加到 CR 终止的 ascii 到达串行端口。

Minicom 报告其版本为:

Welcome to minicom 2.1  

OPTIONS: History Buffer, F-key Macros, Search History Buffer, I18n      
Compiled on Jun  6 2007, 06:02:15.
Run Code Online (Sandbox Code Playgroud)

我希望这会有所帮助,并至少为其他人节省一些时间和精力。谁能想到在 Linux 中安装 HyperTerm 会如此痛苦?