通过阅读《构建无线传感器网络》一书,我了解到可以使用 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。