3

我想使用 GNU 屏幕来监控这样的串行 USB 端口:

$ screen /dev/ttyUSB0 115200

但我需要调整一些终端线路设置。我做了几次尝试,但似乎都没有奏效。例如,要为换行符发送 NL+CR,而不仅仅是 NL,终端行设置为 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

就好像 screen 忽略了任何 stty 设置并将它们重置为它自己的默认值。这在我测试过的两台机器上都是一样的;Debain 8.7 和 macOS Sierra 10.12.4

我看过其他人面临类似问题的帖子,但没有一个给出明确的答案。许多人最终推荐了一种替代屏幕的方法,例如 minicom,但现在我很感兴趣。

stty设置,比如onlcr,可以和screen一起使用吗?

4

3 回答 3

1

我只是经历了几乎相同的过程,只是发现屏幕无论如何都会破坏 stty 设置。这里的一条评论建议更改屏幕源代码: How to toggle CR/LF in gnu screen?

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

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

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

于 2017-11-16T13:36:27.597 回答
0

如果您打开了两个终端窗口,您可以做的另一件事是在没有任何工作时进行低级回退黑客攻击:在一个终端类型cat /dev/ttyUSB0中。然后在其他设置你想要的终端选项sudo stty。然后从同一个终端,您可以通过echo "Some text" > /dev/ttyUSB0. 您可以通过管道转换 cat 命令的输出sedtr。例如cat /dev/ttyUSB0 | tr '\r' '\n',将任何收到的回车转换为换行。

于 2018-05-24T02:57:13.830 回答
0

我处理这个问题的方法是在screen没有任何特殊终端选项的情况下开始运行:screen /dev/ttyUSB0 115200,然后让它运行,然后切换到另一个终端窗口并stty从那里执行命令。

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

如果您只有一个终端窗口,那么这是有问题的,因为放在screen后台并让它运行只会在 shell 和screen进程之间混合输入和输出流。

于 2018-05-24T02:17:25.227 回答