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

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

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

我显然对这个领域不是很了解,所以任何帮助我都会非常感激。

答案1

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

uname -a

给出:

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

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

sudo screen /dev/ttyS0 115200,cs8,-parenb,-cstopb,echo

或这个:

sudo screen /dev/ttyS0 115200,cs8,-parenb,-cstopb,inlcr,onlret,echo

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

-echo  

这可以通过命令来验证

sudo stty -F /dev/ttyS0 -a

在单独的终端窗口中。

此外,我发现使用以下方式脱离屏幕会话

ctrl-A d

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

[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 ~]$ 

因此,我们分离的屏幕会话仍在运行,但 screen -ls 显示 NADA。在附加到 /dev/ttyS0 的屏幕会话仍然启动时,让我们看看 echo 的状态(上面设置为活动状态)。如果我们现在检查 /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 ~]$ 

最后,尝试其他方法来重新连接:

[iceman@localhost ~]$ screen -x
There is no screen to be attached.
[iceman@localhost ~]$ screen -r
There is no screen to be resumed.
[iceman@localhost ~]$ 

这可能是浪费大量时间的根源,因为搜索小写“screen”的过程中不会出现任何结果!

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

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

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

sudo minicom -s

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

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

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

sudo minicom ser1

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

ctrl-A E

打开本地回声并

ctrl-A A

在到达串行端口的 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.

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

答案2

尝试picocom --baud 115200 --echo /dev/ttyUSB0

如果您更喜欢 GUI 工具,请尝试putty:在“终端”配置屏幕下,在“线路纪律选项”下将“本地回显”设置为“强制开启”。

答案3

FWIW,

重新连接屏幕效果很好。如果您使用

 sudo screen

创建会话。所有后续对 screen 的调用都需要 sudo。

相关内容