如何在GNU Screen中切换CR/LF?

33

我正在使用screen从串口控制台读取文本。问题是输出似乎只有换行符\n而没有回车符\r,因此显示的效果如下...

Line1
     Line2
          Line3

我想知道是否有任何补丁可以修复这个问题?


1
也许是一些 stty 设置?不过我觉得很奇怪,因为你是在“读取”时看到的。 - ninjalj
@ninjalj,这是几年前的事情了。然而,在阅读时观察这一点是有意义的。在这种情况下,设备没有发送回车符,因此stty指示终端将换行视为换行和回车。否则,我们可以看到终端移动到下一行,但不会将索引指针返回到行的开头,就像如果\r\n一起发送一样。 - sherrellbc
4个回答

30

onlcr 是用于将传出的换行符翻译为回车符。

stty -F /dev/ttyS0 inlcr 将传入的换行符翻译为回车符。您可以在启动 screen 后从另一个终端运行此命令,以避免任何屏幕可能在启动时进行的重置。然而,这只会改变问题。您将仅获得回车符而没有换行符。

需要一种选项,以使传入的换行符附加一个回车符,从而使终端接收到 \n\r,这应该是串行设备应该首先输出的内容。似乎有一个 onlret 选项可用于传出数据,但在我们需要的情况下没有 inlret 选项。

我也遇到了完全相同的问题(不过我是使用 picocom),已经搜索了几天,试图找到标准解决方法,但似乎没有人有一个。有许多串行设备只输出 \n,根本无法输出 \r\n,我拒绝相信所有这些设备都属于只有两个 Linux 用户。发生了什么!?


12
在 picocom 中,您可以在命令行选项中添加“--imap lfcrlf”。这将在从串行端口读取 LF 后将其转换为 CR + LF。 - andreasw
另外,对于使用Gtkterm的用户,请在“配置”菜单下勾选“CR LF自动”。 - andreasw
1
microcom会自动处理映射。 - stefanct
1
你可以在启动 screen 后从另一个终端运行该命令,以避免 screen 在启动时进行重置。但并非所有情况都适用。在我的设备上,如果我启动 screen 后尝试运行 stty 命令,会出现 Device or resource busy 的错误提示。 - MRule

16
如果您使用附带pyserial的miniterm.py程序,则它将把换行符解释为crlf。虽然它不是最完整的终端仿真器,但对于与简单串行设备交互来说,它能胜任工作。
在OSX上的使用语法:
miniterm.py /dev/tty.usbserial-XXXXXX 115200

用设备在系统中显示的任何名称替换XXXXXX。


1
谢谢分享,屏幕真的让我很烦! - nic
在我的Linux发行版中搜索并找到了几个Git仓库中的miniterm.py。请注意,我必须运行sudo python /path/to/miniterm.py ... - Ari
你可以通过使用以下命令来运行,而无需搜索路径:$ python3 -m serial.tools.miniterm <port> <speed>(参考pyserial工具文档)- 或许可以编辑答案。 - undefined

4
尝试使用 stty onlcr 命令。根据man文档,该命令可将换行符转换为回车符/换行符组合以进行输出,这似乎是您所需要的。

2
是的,我尝试了这个,但是没有起作用。stty -F /dev/ttyS0 onlcr - Patrick
1
奇怪的是,我使用screen打开串口后,stty设置会自动更改为-onlcr。我想知道是否是screen覆盖了在stty中设置的设置?我使用的命令是:screen /dev/ttyS0 115200。 - Patrick
3
有趣的是,似乎 screen 在启动时会重置它正在运行的 TTY。我不知道是否可以避免这种情况,除非打补丁并构建自己的二进制文件。 - Frédéric Hamidi
1
在屏幕源代码tty.c中定义了(ONLCR)。我会尝试它。 - Patrick
1
有人知道如何配置tty.sh吗? - Patrick
1
过去,onlcr在使用pl2303驱动程序的USB串行适配器上无法工作。该错误已经修复,但是一些设备仍在使用旧版Linux内核。 - dreamlayers

3
在我的情况下,以下命令起作用:stty -F /dev/ttyACM0 -icrnl。因为串行通信默认将CR转换为NL,在执行该命令后会将其重新设置回去。请注意减号前缀 icrnl

这对我似乎不起作用。当屏幕启动时,屏幕会重置由stty配置的任何选项,因此这样做没有任何效果。向屏幕提供“-icrnl”似乎被忽略了? - MRule

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接