GNU Screen终端线设置

时间:2017-04-24 08:28:39

标签: gnu-screen stty

我想使用GNU屏幕来监控串行USB端口,如下所示:

$ screen /dev/ttyUSB0 115200

但我需要调整一些终端线设置。我做了几次尝试,但似乎都没有效果。例如,要为换行符而不仅仅NL发送NL + CR,终端线设置为onlcr。

尝试1 - 没有任何特殊设置:

$ screen /dev/ttyUSB0 115200
# only sends NL

尝试2 - 通过屏幕:

$ screen /dev/ttyUSB0 115200,onlcr
# still only sends NL

尝试3 - 通过ssty:

$ stty -F /dev/ttyUSB0 onlcr
$ screen /dev/ttyUSB0 115200
# still only sends NL

尝试4 - 通过两者:

$ stty -F /dev/ttyUSB0 onlcr
$ screen /dev/ttyUSB0 115200,onlcr
# still only sends NL

尝试5 - 按其他顺序:

$ screen /dev/ttyUSB0 115200,onlcr
# then ctrl+a, ctrl+z to pause the screen session
$ stty -F /dev/ttyUSB0 onlcr
stty: /dev/ttyUSB0: Device or resource busy

在所有情况下,如果我运行stty检查终端线设置,我会得到:

在运行屏幕之前 - 请注意-onlcr存在:

$ stty -F /dev/ttyUSB0 
speed 115200 baud; line = 0;
kill = ^H; min = 100; time = 2;
-icrnl -imaxbel
-opost -onlcr
-isig -icanon -echo

更改stty设置 - 请注意-onlcr已经消失:

$ stty -F /dev/ttyUSB0 onlcr
$ stty -F /dev/ttyUSB0 
speed 115200 baud; line = 0;
kill = ^H; min = 100; time = 2;
-icrnl -imaxbel
-opost 
-isig -icanon -echo

运行屏幕后 - 请注意-onlcr再次返回:

$ stty -F /dev/ttyUSB0 
speed 115200 baud; line = 0;
kill = ^H; min = 100; time = 2;
-icrnl -imaxbel
-opost -onlcr
-isig -icanon -echo

就好像屏幕忽略任何stty设置并将它们重置为它自己的默认设置。在我测试它的两台机器上也是如此; Debain 8.7和macOS Sierra 10.12.4

我看过其他人面临类似问题的帖子,但都没有给出明确答案。很多人最终会推荐像minicom这样的屏幕替代品,但现在我很感兴趣。

像onlcr这样的stty设置可以和屏幕一起使用吗?

3 个答案:

答案 0 :(得分:0)

我刚刚经历了相同的过程,只是为了找出屏幕上的垃圾,不管是什么。这里有一条评论建议更改屏幕源代码: How to toggle CR/LF in gnu screen?

最后,我很高兴找到一个更简单的哑终端程序,它允许在命令行上传递stty风格的参数: https://github.com/npat-efault/picocom

它还可以在启动时打印串口设置,以便您轻松检查它们。

软件包存在于Debian派生的发行版(sudo apt-get install picocom)中,而对于其他软件包,似乎编译很简单。一个依赖是linenoise库,可以禁用它。

答案 1 :(得分:0)

我处理此问题的方法是在没有任何特殊终端选项的情况下启动screen运行:screen /dev/ttyUSB0 115200,然后让它保持运行,然后切换到另一个终端窗口并执行{ {1}}来自那里的命令。

如果你停止stty,我认为它会以某种方式锁定设备(或者因为你没有使用screen)。进入另一个窗口后,您可以键入sudo,这将改变sudo stty -F /dev/ttyUSB0 onlcr会话的行为。问题是screen忽略了传递给它的设置,只是按照自己的方式配置tty。您可以在屏幕运行时键入screen列出其他窗口中的设置,然后根据需要进行更改。 (请注意,在Mac上,sudo stty -F /dev/ttyUSB0 -a应为小写。)

如果你只有一个终端窗口,那么它就有问题了,因为在后台放置-F并使其保持运行只会混合shell和screen进程之间的输入和输出流。

答案 2 :(得分:0)

如果你打开两个终端窗口,你可以做的另一件事是当没有任何工作时低级别的后备黑客攻击:在一个终端类型cat /dev/ttyUSB0中。然后在另一个中使用sudo stty设置所需的终端选项。然后,您可以通过echo "Some text" > /dev/ttyUSB0从同一终端发送命令。您可以通过sedtr来管理cat命令的输出。例如,cat /dev/ttyUSB0 | tr '\r' '\n'会将收到的回车转换为换行符。

相关问题